링크 https://www.acmicpc.net/problem/1152
문제 설명
풀이 과정
처음 문제를 봤을 때, split이 떠올라서 split으로 공백 기준으로 단어를 잘라서 해당 배열의 갯수를 출력하도록 아래와 같은 코드를 작성했다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
sc.close();
System.out.println(str.split(" ").length);
}
}
하지만 결과는 틀렸고.. 문제를 다시 한 번 읽어보니 예외 조건이 있었다.
"또한 문자열은 공백으로 시작하거나 끝날 수 있다."
즉 "Seong Hyeon" 을 입력할 수 있고, " Seong Hyeon " 도 입력할 수 있다는 뜻이다.
그래서 테스트를 해보니 "Seong Hyeon" 을 입력하면 2가 출력되지만 " Seong Hyeon " 을 입력하면 3이 출력된다.
디버깅을 해보니 배열에 "", "Seong", "Hyeon" 총 3개가 저장되어 있는 것을 확인했다.
그래서 split 함수 내부동작을 확인해보니 매치되는게 없으면 자기 자신을 반환하도록 되어있다.
// If no match was found, return this
if (off == 0)
return new String[]{this};
그래서 "SeongHyeon" 을 입력해서 테스트를 해봤는데 1이 출력됐다.
결과
split을 사용하게 되면 공백을 기준으로 나눴을 때, 빈 문자열인지 아닌지도 체크해야 하고 번거롭기 때문에 다른 메소드를 찾게 되었다.
구글링으로 StringTokenizer 라는 클래스를 찾게 되었고 해당 클래스를 사용하기로 했다.
StringTokenizer? 문자열을 특정 구분자로 분리할 때 유용한 클래스이다.
StringTokenizer 클래스는 빈 문자열을 인식하지 않고, Split 메소드는 빈 문자열을 인식하는 큰 차이점이 있다.
그래서 StringTokenizer 클래스를 활용하여 아래와 같은 코드를 작성하여 제출했다.
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
sc.close();
StringTokenizer st = new StringTokenizer(str, " ");
System.out.println(st.countTokens());
}
}
문제를 꼼꼼히 읽어야 하고, 백준은 정말 꾸준히 해야 할 것 같다. 많은 부족함을 느꼈다.
'✏️ BOJ' 카테고리의 다른 글
[프로그래머스] 크레인 인형뽑기 게임 - Java(자바) (0) | 2023.06.22 |
---|---|
[백준] 2309 일곱 난쟁이 - Java(자바) (0) | 2023.04.24 |
[백준] 1547 공 - Java(자바) (0) | 2023.03.23 |
[백준] 2490 윷놀이 - Java(자바) (0) | 2023.03.21 |