본문 바로가기
프로그래밍/코딩 문제 풀이

프로그래머스 2023.07.25 (1Lv 문자열 나누기)

by Rozentea 2023. 7. 25.
 

프로그래머스

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

programmers.co.kr

문제


문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
  ◈ 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  ◈ 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  ◈ s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  ◈ 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

제한사항
  ◈ 1 ≤ s의 길이 ≤ 10,000
  ◈ s는 영어 소문자로만 이루어져 있습니다.

입출력 예
s result
"banana" 3
"abracadabra" 6
"aaabbaccccabba" 3

입출력 예 설명
입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.

입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.

입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.

코딩


#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;

    string str_Test = "";
    str_Test += s.at(0);
    s.erase(s.begin());

    while (true)
    {
        char cTarget = str_Test.at(0);

        int iSameCount = 0;
        int iDefCount = 0;

        for (size_t i = 0; i < str_Test.length(); ++i)
        {
            if (cTarget == str_Test.at(i))
                iSameCount++;
            else
                iDefCount++;
        }

        if (iSameCount == iDefCount)
        {
            answer++;

            if (!s.empty())
            {
                str_Test.clear();
                str_Test += s.at(0);
                s.erase(s.begin());
            }
            else
                return answer;
        }
        else
        {
            if (!s.empty())
            {
                str_Test += s.at(0);
                s.erase(s.begin());
            }
            else
                return ++answer;
        }
    }
}

우선 해당 문제에 대해 이해를 해야한다.

은근히 문제를 이해하지 못하는 경우가 있는 것 같았다. (저도 문제를 읽고 이해를 잘 못해서 해맸습니다.. ㅠ)

 

아래 그림을 보면 이해하시는데 도움이 되실겁니다.

<banana 예시>
<abracadabra 예시>
<aaabbaccccabba 예시>

저는 검사용으로 자른 문자열을 담을 string str_Test를 선언해주고, 이곳에 s의 첫 문자를 추가해가면서 검사를 진행했습니다.

str_Test의 첫 문자가 검사할 문자 대상인 x가 되고, str_Test의 길이 만큼 반복 수행해 str_Test에서 x와 같은 문자 갯수(iSameCount) 와 다른 문자 갯수(iDefCount)를 모두 구한 후, iSameCount와 iDefCount를 비교해 갯수가 같다면, 문자열이 나뉜 것이므로 answer를 1증가시켜주고, str_Test를 비워준 뒤, s의 다음 문자를 추가해 주었습니다. (s에서 str_Test로 문자를 추가할때는 s의 해당 문자를 지워주었습니다.)

이때, s가 텅비어서 추가할 문자가 없을 경우 문자열 나누기가 끝난 것이므로 answer를 1증가한 뒤 반환해주도록 하였습니다.

iSameCount와 iDefCount가 서로 다르다면, 문자열이 나뉘어지지 않은 것이므로 str_Test에 s의 첫 문자를 추가해 다시 검사를 진행해 주었습니다.

이때, 만약 s가 텅 비어서 다음 문자를 넣어줄 수 없다면, 모든 문자열 나누기를 마쳤다는 뜻이므로 동일하게 answer를 1증가해 반환해주었습니다.

 

실행 결과