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라는 변수로 코드가 직관적이게 변했다. 이전 상태를 고려해서 단어의 시작점만 골라낼 수 있었다.
'알고리즘 문제풀이 > C++' 카테고리의 다른 글
| [백준/C++] 2609번: 최대공약수와 최소공배수 - 브루트 포스 vs 유클리드 호제법 (0) | 2026.02.08 |
|---|---|
| [백준/C++] 1259번: 팰린드롬수 - 투 포인터와 인덱스 조건의 중요성 (0) | 2026.02.04 |
| [백준/C++] 2798번: 블랙잭 - 인간의 직관 vs 컴퓨터의 무식함 (브루트 포스) (0) | 2026.02.04 |
| [백준/C++] 1978번: 소수찾기- 제곱근을 이용한 최적화 (0) | 2026.02.04 |
| [백준/C++] 1008번: A/B - float와 double의 차이 (정밀도) (0) | 2026.01.28 |