
풀이
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
string s;
int ans = 1;
getline(cin, s);
if (s.length() == 1 && s[0] == ' ') {
cout << 0;
return 0;
}
for (int i = 1; i < s.length()-1; i++) {
if (s[i] == ' ') {
ans++;
}
}
cout << ans;
return 0;
}
처음의 풀이 방법은 `getline`을 통해 문자열을 한 줄 전체를 입력받고 반복문을통해 문자열을 직접 순회하며 공백을 만나면 단어 수를 증가시키는 로직을 생각했다. 맨 앞과 맨 뒤 공백이 들어왔을때 예외처리를 생각하지 못해서 자꾸 오답이 뜨길래 생각해봤더니 전체 문자열을 순회하면서 공백을 만날 때 마다 단어 개수를 증가시켰더니 맨 앞, 맨 뒤의 공백까지 포함해버려서 오답이 나는거였다.
그래서 혹시... 예외 처리를 생각하지 않을 방법은 없을까 했더니 다음과 같은 풀이방법을 찾았다.
다른 풀이
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
getline(cin, s); // 한 줄 전체 입력
stringstream ss(s); // 문자열을 스트림처럼 다루기
string word;
int cnt = 0;
// 공백을 기준으로 단어를 하나씩 읽어옴
while (ss >> word) {
cnt++;
}
cout << cnt;
return 0;
}
`getline`을 사용하여 문자열 한 줄을 통으로 받아오는건 동일하지만 `stringstream`을 사용하여 예외처리를 생각하지 않고도 해결할 수 있었다.
여기서 `stringstream`이란 c++의 라이브러리중 하나로 문자열을 `cin`에서 입력받는 것처럼 `>>`연산자를 통해 토큰 단위로 뽑아 쓸 수 있다.
string word;
while (ss >> word) {
// ss에서 공백 기준으로 하나씩 단어를 읽어옴
}
이 부분의 코드에서 `ss >> word`는 내부적으로
- 앞쪽 공백을 모두 무시하고
- 공백이나 문자열 끝까지를 `word`에 저장한다.
- 이후 더 이상 읽을게 없으면 `false`가 되어 `while`을 탈출하는 식으로 동작한다.
그렇기 때문에
- 단어 사이의 공백이 여러 개 있어도
- 앞뒤에 공백이 있어도
단어 개수를 정확하게 셀 수있다.
'Memo > PS' 카테고리의 다른 글
| [백준] 1919 애너그램 만들기 (0) | 2025.12.21 |
|---|---|
| [백준] 11328 Strfry (0) | 2025.12.19 |
| [백준] 10807 개수 세기 (0) | 2025.12.18 |
| [백준] 2444 별찍기 - 7 (0) | 2025.12.13 |
| [백준] 10809 알파벳 찾기 (0) | 2025.12.10 |