독서하는 개발자's Blog

반응형

문제

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.


입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.


출력

첫째 줄에 단어의 개수를 출력한다.



예제 입력 - 1 

The Curious Case of Benjamin Button

예제 출력 - 1

6


예제 입력 - 2

          Mazatneunde          Wae               Teullyeoyo

예제 출력 - 2

3



문제 풀이

 이 문제는 공백을 어떻게 없애고 단어의 개수를 출력할 것인가에 대해서 중점적으로 봐야합니다.

참고로 공백이 두번들어갈 경우 즉, 띄어쓰기가 단어 사이에 여러번 들어갈 경우를 고려해야 합니다.


틀린 풀이)


1
2
3
4
5
6
7
8
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String eng = scan.nextLine();
        
        String[] arr = eng.trim().split(" ");
        System.out.println(arr.length);
        scan.close();
    }
cs


겉으로 보기에는 trim으로 문장 양옆 공백제거하고 split으로 공백을 기준으로 문장을 잘라서 성공한 것처럼 보입니다.


물론, 예제 1번은 문제없이 6이라는 숫자가 출력됩니다.


그러나, 예제 2번처럼 문장사이에 공백이 많은 경우, 위에 방식처럼하면 띄어쓰기도 개수에 포함시키기 때문에 26이라는 숫자가 나옵니다.


옳은 풀이)


1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String eng = scan.nextLine();
        
        StringTokenizer st = new StringTokenizer(eng, " ");
        
        System.out.println(st.countTokens());
        
        scan.close();
    }
cs


위에 풀이처럼 단어사이에 공백을 제거하기 보다는 토큰단위로 묶어서 자르면 될 것 같습니다.


StringTokenizer Class는 문장의 공백을 생략하고 단어로 묶어서 사용하기 때문에,

st 객체에 StringTokenizer로 입력한 문자의 " "(공백)을 기준으로 묶어서 갯수를 확인하겠다. 라는 의미입니다.


출력에서 StringTokenizer의 메소드 countTokens()을 사용하여 묶인 토큰의 갯수를 출력시켜줍니다.


아까 잘못된 풀이에서는 26이라고 나온 숫자가 StringTokenizer Class를 사용함으로써 3이라고 정상 출력됩니다.




반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band