본문 바로가기

[백준] 1152 단어의 개수

@cayman0312025. 12. 11. 08:45

 

풀이

#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
cayman031
@cayman031 :: 그누로그

목차