링크 https://www.acmicpc.net/problem/1152
1152번: 단어의 개수
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열
www.acmicpc.net
문제 설명
풀이 과정
처음 문제를 봤을 때, 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 |