본문 바로가기

[프로그래머스/C++] 문자열 나누기

@ansi.2024. 2. 23. 22:02

 

https://school.programmers.co.kr/learn/courses/30/lessons/140108

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Lv. 1


  • 문제 설명이 다소 모호하기 때문에 우선 문제에서 정확히 무엇을 요구하고 있는지를 파악하는 게 관건이다.
  • 중요한 것은 '첫 문자가 아닌 문자들이 나온 횟수'의 의미이다. 이는 '첫 문자가 아닌 문자가 나온 횟수의 합'과 같은 의미이다.

 

문제의 [입출력 예 #3]를 통해 자세히 알아보자.

입출력 예 #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;
}
ansi.
@ansi. :: 공부 기록 공간 🌟

공부한 걸 기록합니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차