2026. 5. 19. 10:18ㆍProgrammers
문제 설명
문자열 s가 주어질 때, 다음 규칙으로 문자열을 분해하고 분해한 개수를 반환하는 문제이다.
- 첫 글자를 x로 정한다.
- x와 같은 글자의 수와 다른 글자의 수가 같아지면 문자열을 분리한다.
- 남은 문자열에 대해서 반복한다.
- 끝까지 읽었는데 횟수가 다르면 그대로 분리하고 종료.

문제 해석
포인트는 두 가지이다.
1. 분해 기준 매 분해마다 첫 글자가 x로 새로 정해진다. "banana"에서 첫 분해는 b가 x가 되고, 다음 분해는 n이 x가 되는 방식이다.
2. 끝까지 못 맞추는 경우는 두 횟수가 끝내 같아지지 않으면 남은 문자열 전체를 하나로 분리하고 종료한다. 이 경우도 answer에 +1 해야한다.
문제풀이
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
int i = 0;
while(i < s.size()) {
char x = s[i];
int count1 = 0, count2 = 0;
while(i < s.size()) {
if(s[i] == x) ++count1;
else ++count2;
++i;
if(count1 == count2) {
++answer;
break;
}
}
if(count1 != count2) ++answer;
}
return answer;
}
핵심 포인트
바깥쪽 while문
분해 반복을 한 번 돌 때마다 문자열을 하나씩 분해한다. i가 끝에 도달하면 종료된다.
안쪽 while문
한 덩어리씩 탐색해서 x와 같으면 count1을, 다르면 count2를 증가시켜 매 글자마다 두 카운트가 같은지 체크한다.
같아지면 break하고 answer를 올린 후 다음 문자열을 탐색한다.
트러블 슈팅
처음에 이중 for문 조작 방식으로 접근했다.
그래서 코드의 결과가 예상하던 바와 다르게 나왔다.
for(int i = 0; i < s.size(); ++i)
{
char word = s[i];
for(int j = i+1; j < s.size(); ++j)
{
// ...
if(count1 == count2)
{
++answer;
i += j; // 다음 시작점으로 이동
break;
}
}
}
i += j로 다음 시작점을 이동시키는 방식이었다.
예시인 "banana"를 기준으로 추적하면
i=0, word='b'
j=1, 'a' != 'b' → count1==count2 → answer=1
i += j-1 → i += 0 → i=0
바깥 ++i → i=1
i=1, word='a'
j=4에서 count1==count2 → answer=2
i += j-1 → i += 3 → i=4
바깥 ++i → i=5
i=5, word='a'
j=6 → 안쪽 루프 안 돎 → 마지막 "na" 분리 실패
마지막 문자열인 "na"를 체크하지 못해서 answer = 2가 나와 오답이 되었다.
해결방법
정답 코드와 같이, 이중 for문에서 i를 하나로 지정하고 바깥쪽과 안쪽 while문이 공유하는 구조로 변경했다.
안쪽 while에서 증가된 i 값은 안쪽 루프가 끝나고 바로 다음 가리켜야 할 문자열의 시작 위치로 이동하기 때문에 이 방식을 사용해도 옳은 방향으로 진행되었다.
인덱스도 두 가지를 사용하면서 꼬일 걱정이 없었다.
'Programmers' 카테고리의 다른 글
| <프로그래머스 C++> 둘만의 암호 풀이 (1) | 2026.05.21 |
|---|---|
| <프로그래머스 C++> 휴대폰 자판 풀이 (0) | 2026.05.20 |
| <프로그래머스 C++> 체육복 풀이 (0) | 2026.05.18 |
| <프로그래머스 C++> 두 수의 짝꿍 풀이 (0) | 2026.05.15 |
| <프로그래머스 C++> 옹알이(2) 풀이 (0) | 2026.05.14 |