알고리즘 문제풀이/C++

[백준/C++] 1152번: 단어의 개수 - 문자열 공백 처리

aerimi-code 2026. 1. 28. 15:04

1. 문제 정보

  • 문제 번호: 1152번
  • 문제 이름: 단어의 개수
  • 사용 언어: C++
  • 문제 링크: 백준 1152번 바로가기
  • 문제 요약: 영어 대소문자와 공백으로 이루어진 문자열이 들어온다. 이 문자열에 있는 단어의 개수를 구하는 프로그램을 작성하시오. 단, 단어는 공백 한 개로 구분되며, 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

 

 

2. 접근 방법 (알고리즘)

이 문제의 핵심은 "앞뒤 공백"과 "단어 사이의 공백"을 어떻게 처리하느냐이다. 단순히 공백의 개수 + 1로 계산하면, 앞뒤에 공백이 있거나 빈 문자열이 들어올 때 오답이 된다.

따라서 상태 변수(Flag)를 활용한다.

 

  1. 문자열을 한 글자씩 순회
  2. inWord (현재 단어 안인지 판별하는 boolean 변수) 활용
  3. 공백이 아닌 문자가 나왔는데, !inWord (방금 전까지 공백이었음) 상태라면?
    • "새로운 단어가 시작되었다"는 뜻이다.
    • 이때 count를 1 증가시키고, inWord를 true로 바꾼다.
  4. 공백이 나오면?
    • 단어가 끝났으므로 inWord를 false로 바꾼다.

이 방식을 사용하면 문자열 맨 앞의 공백이나, 단어 사이의 여러 공백을 무시하고 "단어의 시작점"만 정확히 셀 수 있다.





3. 코드 구현(C++)

 

#include <iostream>
#include <string> // getline 사용을 위해 필요
using namespace std;

int main() {
    string line;
    int count = 0;
    bool inWord = false; // 현재 단어 내부인지 여부 
    
    // 공백을 포함한 한 줄을 통째로 입력받음
    getline(cin, line);
    
    for(char c : line) {
        // 1. 공백이 아닌 문자를 만났을 때
        if(c != ' ') {
            // 방금 전까지 단어 밖(공백)이었다면 -> 새 단어 시작
            if(!inWord) {
                count++;
                inWord = true; // 단어 안으로 진입 
            }
        }
        // 2. 공백을 만났을 때
        else {
            inWord = false; // 단어 밖으로 나감 
        }      
    }
  
    cout << count;
    
    return 0;
}

 

4. 배운 점 & 회고 (TIL)

 

A. 문제를 꼼꼼히 읽자 (Edge Case)

처음에는 단순히 생각해서 구현했다가, 예외 케이스 처리(맨 앞 공백, 빈 문자열 등) 를 못 했다.

 

B. 조건문과 상태 변수(Flag)의 활용

inWord라는 변수로 코드가 직관적이게 변했다. 이전 상태를 고려해서 단어의 시작점만 골라낼 수 있었다.