알고리즘 문제풀이/C++
[백준/C++] 1152번: 단어의 개수 - 문자열 공백 처리
aerimi-code
2026. 1. 28. 15:04
1. 문제 정보
- 문제 번호: 1152번
- 문제 이름: 단어의 개수
- 사용 언어: C++
- 문제 링크: 백준 1152번 바로가기
- 문제 요약: 영어 대소문자와 공백으로 이루어진 문자열이 들어온다. 이 문자열에 있는 단어의 개수를 구하는 프로그램을 작성하시오. 단, 단어는 공백 한 개로 구분되며, 문자열의 앞과 뒤에는 공백이 있을 수도 있다.
2. 접근 방법 (알고리즘)
이 문제의 핵심은 "앞뒤 공백"과 "단어 사이의 공백"을 어떻게 처리하느냐이다. 단순히 공백의 개수 + 1로 계산하면, 앞뒤에 공백이 있거나 빈 문자열이 들어올 때 오답이 된다.
따라서 상태 변수(Flag)를 활용한다.
- 문자열을 한 글자씩 순회
- inWord (현재 단어 안인지 판별하는 boolean 변수) 활용
- 공백이 아닌 문자가 나왔는데, !inWord (방금 전까지 공백이었음) 상태라면?
- "새로운 단어가 시작되었다"는 뜻이다.
- 이때 count를 1 증가시키고, inWord를 true로 바꾼다.
- 공백이 나오면?
- 단어가 끝났으므로 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라는 변수로 코드가 직관적이게 변했다. 이전 상태를 고려해서 단어의 시작점만 골라낼 수 있었다.