오늘은 백준 1152번 풀거다! 와 이게 쉬운데 함정이 많더라구요.

저처럼 문제 대충 쓱 보고 풀면 틀려요!

ㅋㅋㅋ 문제만 보고 예제를 제대로 보지도 않고 그냥 '그냥 공백으로 자르면 되는거 아닌가..?' 하고 바로 냈더니 바로 "틀렸습니다" ... 

그래서 예제를 살펴봤더니, 예제 입력 2를 보면 다른 녀석들과는 다르게 제일 앞에 공백이 있는거에요! " Maza..." 그래서 아~ 이런~ 하고 제일 앞이 공백일때만 처리해줬더니 또 다시 보기 좋게 "틀렸습니다" ... 

아 도대체 이 문제에 어떤 예외를 넣었을까 열심히 또 돌려봤죠. 그러고서 알아냈어요.. 역시 처음부터 쉽게보면 안돼요.. 모든 문제는 이유가 있어요..


서론이 너무 길었어요! 그냥 부끄러워서..

문제는 쉽습니다. 제가 생각했던 것과 마찬가지로 공백으로 자르면 돼요. 하나하나 들어가 볼게요!

...  단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

우선 단어는 띄어쓰기 한 개로 구분이 되니, 원래 제 시도처럼 공백으로 자르면 됩니다.

1. 띄어쓰기를 통해 문자열을 구분짓는다.

문제는 바로 빨간줄로 표시한 '공백이 연속해서 나오는 경우는 없다.'에요. 공백이 연속해서 나오진 않지만, 바로 그 뒤를 보면 '문자열의 앞과 뒤에는 공백이 있을 수도 있다.' 그냥 말장난인것같긴 한데,,

정리해 보면 다음과 같아요.

1. 띄어쓰기를 통해 문자열을 구분짓는다.
- apple banana chocolate
2. 문자열 앞과 뒤에는 공백이 있을 수 있다.
- apple  banana chocolate
-  apple banana chocolate
- ...
3. 공백이 연속해서 나오는 경우는 없다.
-  apple   banana (불가능)

즉 3번은 안되지만, 2-1번과 같이 문자열 뒤, 그리고 문자열 앞 에 존재하는 각각의 공백은 겹칠 수 있어요!

따라서 우리는 공백으로 문자열을 자를 때, 잘라진 문자열에 대한 배열이 비어있는지 확인해 주면 끝입니다.

2-1번에 대하여 우리가 공백으로 문자열을 자르면, 다음과 같은 형상이기 때문입니다.

[0]: apple
[1]: 
[2]: banana
[3]: chocolate

최종코드

import java.util.Scanner;

public class Number1152 {
    public static void main(String[] args){
        String[] str = new Scanner(System.in).nextLine().split(" ");
        int count = 0;
        for(int i = 0; i < str.length; i++)
            if(!str[i].isEmpty())
                count++;
        System.out.println(count);
    }
}

끝!

+ Recent posts