https://school.programmers.co.kr/learn/courses/30/lessons/140108
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Lv. 1
- 문제 설명이 다소 모호하기 때문에 우선 문제에서 정확히 무엇을 요구하고 있는지를 파악하는 게 관건이다.
- 중요한 것은 '첫 문자가 아닌 문자들이 나온 횟수'의 의미이다. 이는 '첫 문자가 아닌 문자가 나온 횟수의 합'과 같은 의미이다.
문제의 [입출력 예 #3]를 통해 자세히 알아보자.

위 예제에서 문자열이 분리되는 과정은 다음과 같다.
- 처음에 검사할 문자 그룹은
aaabbaccccabba로, 이 문자 그룹에서 첫 문자는 'a'이다. 첫 문자부터 오른쪽으로 검사해나가면 8번째 문자 'c'를 검사하는 순간에 'a'가 등장한 횟수는 4번, 'a'가 아닌 문자가 등장한 횟수 역시 4번('b' 2번 + 'c' 2번)으로 두 횟수가 같아져 문자열이 분리된다. - 문자열을 분리했으므로 다음에 검사할 문자 그룹은
ccabba이 된다. - 이 문자 그룹에서 첫 문자는 'c'이고, 오른쪽으로 검사하다보면 4번째 문자 'b'에서 첫 문자 'c'가 나온 횟수는 2번, 'c'가 아닌 문자가 나온 횟수가 2번('a' 1번 + 'b' 1번)으로 두 횟수가 같아져 다시 문자열이 분리되어, 다음에 검사할 문자 그룹은
ba가 된다.
이런 식으로 각 문자 그룹을 검사할 때마다 문자 그룹의 첫 문자가 나온 횟수, 그리고 첫 문자가 아닌 문자가 나온 횟수를 카운트해 두 횟수가 같아지는 순간 문자열을 분리한다.
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
char first; // 문자 그룹에서의 첫 번째 문자
int cnt1 = 0; // 문자 그룹에서 첫 번째 문자가 나온 횟수
int cnt2 = 0; // 문자 그룹에서 첫 번째 문자가 아닌 문자가 나온 횟수
for (char c : s) {
if (cnt1 == 0) first = c;
if (c == first) cnt1++;
else cnt2++;
if (cnt1 == cnt2) answer++, cnt1 = 0, cnt2 = 0;
}
if (cnt1 != cnt2) answer++;
return answer;
}'Algorithm' 카테고리의 다른 글
| [프로그래머스/C++] 대충 만든 자판 (0) | 2024.02.24 |
|---|---|
| [프로그래머스/C++] 옹알이 (2) (0) | 2024.02.24 |
| [프로그래머스/C++] 둘만의 암호 (0) | 2024.02.23 |
| [프로그래머스/C++] 로또의 최고 순위와 최저 순위 (0) | 2024.02.23 |
| [프로그래머스/C++] 소수 찾기 (에라토스테네스의 체) (0) | 2024.02.23 |