#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 |