Code KATA/알고리즘 코드카타

[2025.02.24] 문자열 나누기

iiblueblue 2025. 2. 4. 10:04

문제 설명

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 y가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

 

 

제한사항

  • 1<=s의 길이<=10,000
  • s는 소문자로만 이루어져 있습니다.

 

 

입출력 예

s result 설명
"banana" 3 s="banana"인 경우 ba - na - na와 같이 분해됩니다.
"abracadabra" 6 s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다 
"aaabbaccccabba" 3 s= "aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    
    char x=s[0]; // 첫 글자
    int count_x=0; // 첫 글자 수
    int count_notx=0; // 첫 글자와 다른 글자 수
    
    for(int i=0; i<s.length(); i++)
    {
        if(s[i]==x) // 첫 글자와 같다면
        {
            count_x++;
        }
        else // 첫 글자와 다르다면
        {
            count_notx++;
        }
        
        // 첫 글자 수와 다른 글자 수가 같다면
        if(count_x==count_notx)
        {
            // 문자열 수 업데이트
            answer++;
            
            // 변수 초기화
            x=s[i+1];
            count_x=0;
            count_notx=0;
        }
        else if(i==s.length()-1) // 글자수가 다른데 마지막 글자라면
        {
            // 문자열 수 업데이트
            answer++;
        }
    }
    return answer;
}

문제에서 하라는대로 코드로 표현하기만 하면 되는 문제라서 어려운 문제는 아니었다. 마지막에 하나만 신경써주면 될 것 같아 보인다.

 

먼저 필요한 변수들을 선언한다. 첫 글자를 담을 변수 x는 s의 첫글자로 초기화한다. x의 개수를 담을 count_x 그리고 x가 아닌 다른 글자의 수를 담을 변수 count_notx를 선언하고 0으로 초기화한다.

 

이제 반복문을 이용해 x의 개수와 x가 아닌 글자의 개수를 구하고 두 개수가 같아질 때 문자열을 쪼개면 된다. s[i]가 x라면 count_x의 값을 증가시키고, x가 아니라면 count_notx의 값을 증가시킨다. 그 다음 count_x와 count_notx가 같은지 확인하고 같다면 문자열을 쪼개고 사용했던 변수들을 초기화한다. 말이 문자열을 쪼갠다고 하지만 그냥 문자열이 몇개 쪼개졌는지만 return하면 되기 때문에 answer을 하나 증가시켜주면 된다.

 

이렇게만 하면 문제 그대로를 구현한 것 같아보이지만 사실 한 가지 문제가 있다.

  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

아직 이 부분이 구현되지 않은 상태이다. 지금 이대로 돌린다면 마지막에 두 횟수가 차이난채로 끝난다면 마지막 문자열은 문자열 갯수에 포함이 되지 않는다. 그래서 글자수가 다른데 만약 이 글자가 마지막 글자일 때의 조건을 추가한다. 글자수는 다른지만 이 글자가 마지막 글자라면 이 또한 문자열 하나로 인정하여 answer을 하나 증가시켜 준다. 마지막에 두 횟수가 딱 맞게 같아 끝난다면 위에 조건을 아니라면 아래 조건의 코드를 실행하면 끝날 것이다.

 

 

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr