본문 바로가기

백준

1152 단어의 개수

#include <iostream>

using namespace std;

int main() {
    string str;
    int count = 0;
    getline(cin, str);
    
    for(int i = 0; i < str.length(); i++){
        if(i == 0 && str[i] == ' ')
            continue;
        if( i == (str.length() - 1) && str[str.length() - 1] == ' ')
            break;
        
        if(str[i] == ' ')
            count++;
    }
    cout << count + 1;
    return 0;
}

단어의 개수를 구하는 문제였다

쉬웠다! 그런데 틀렸다.

 

일단 단어와 단어 사이에 공백이 하나 있으므로 공백의 개수로 단어를 세려고 했다. 또 문자열 앞과 뒤에 공백이 있을 수도 있으니 공백인지 확인하고 넘어가도록 한다. 

 

단어 확인도 했다. 앞뒤로 공백을 붙여보기도 하고 문자 하나만 넣기도 했다. 문자열의 길이도 10^6이니 터질일도 없다. 그런데도 이유를 모르겠어서 이정도 까지만 코딩하고 밥 먹으러 갔다. 

 

돌아와서 블로그 포스팅을 하려고 백준에 내 코드 보기를 눌렀는데, 놀랍게도 밑에 틀린 이유가 있었다! 보니깐 str.length()는 unsigned int이고 i는 signed int라 둘을 비교할 수 없다는 이유였다. 분명 내가 돌릴때는 돌아갔었는데.. 이런 이유로도 틀릴 수 있구나. 알아둬야겠다.. 

 

#include <iostream>

using namespace std;

int main() {
    string str;
    int count = 0;
    getline(cin, str);
    
    for(unsigned int i = 0; i < str.length(); i++){
        if(i == 0 && str[i] == ' ')
            continue;
        if( i == (str.length() - 1) && str[str.length() - 1] == ' ')
            break;
        
        if(str[i] == ' ')
            count++;
    }
    cout << count + 1;
    return 0;
}

그래서 코드를 unsigned int형으로 바꿨다

 

아니 또 틀렸다. 이번에는 이유도 안 알려준다.

 

#include <iostream>

using namespace std;

int main() {
    string str;
    int count = 0;
    getline(cin, str);
    
    int length = (int)str.length();
    
    for(int i = 0; i < length; i++){
        if(i == 0 && str[i] == ' ')
            continue;
        if( i == (length - 1) && str[length - 1] == ' ')
            break;
        
        if(str[i] == ' ')
            count++;
    }
    cout << count + 1;
    return 0;
}

그래서 아 혹시 str[i] < 배열의 index가 int형이라 unsigned int를 넣으면 안 되나 싶었다. 그래서 따로 lenght() 를 받는 변수를 만들었다. int 형으로! 

 

그런데 또 틀렸다!

#include <iostream>
#include <cstring>

using namespace std;

int main() {
    char str[1000000];
    int count = 0;
    scanf("%[^\n]", str);
    
    int length = strlen(str);
    
    
    for(int i = 0; i < length; i++){
        if(i == 0 && str[i] == ' ')
            continue;
        if( i == (length - 1) && str[length - 1] == ' ')
            break;
        
        if(str[i] == ' ')
            count++;
    }
    printf("%d", count + 1);
    return 0;
}

아 혹시 getline(cin, str) 얘 때문에 틀렸나 싶었다. 아마 아닌 것 같은데 왜 틀렸는지 모르니깐 뭐라도 고쳐봐야지 싶었다. 근데 틀렸다.. 모르겠다.. 

 

알고보니 단어의 개수가 0개일 떄 답을 구하지 못해서 틀렸다..


#include <iostream>
#include <string>

using namespace std;

int main() {
    int words = 0;
    string str;
    
    while(cin >> str)
        words++;
        
    printf("%d", words);
        
    return 0;
}

더 좋은 방법이 있었다!

cin으로 계속 값을 입력받고 더 이상 입력 받을 값이 없으면 cin이 false를 return해서 반복문을 빠져나간다. 

 

n개를 입력 받아라는 말이 없을 때 저런 식으로 입력을 받으면 좋다.

 

C언어에서 file을 입력받을 떄는 while(!feof(fp)) 이렇게 했었는데 stdin으로 입력할때는 이렇게 쓰면 되는구나 신기하다. 

오늘도 많은 걸 배웠다!

 

'백준' 카테고리의 다른 글

11720 숫자의 합  (0) 2019.10.06
1924 2007년  (0) 2019.10.06
17450 과자 사기  (0) 2019.10.06
16917 양념 반 후라이드 반  (0) 2019.10.06
시간복잡도와 공간복잡도  (0) 2019.10.06