문자열 나누기

정경미·2023년 9월 23일

프로그래머스

목록 보기
1/8

문자열 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와 같이 분해됩니다.


재귀
1. 기준이되는 문자열에서 기준이되는 값(첫번째 요소, x)을 추출한다.
2. x 값과 문자열의 각 요소 비교하며, 일치한 횟수와 불일치한 횟수를 카운팅한다.
3. 일치, 불일치 카운트가 동일한지 확인한다.
3-1. 동일한경우, answer += 1
3-1-1. 검수된 문자열 이후의 문자열이 새로운 기준이 되는 문자열이된다. (1.로 진행)
3-2. 동일하지 않은경우, 2.로 계속하여 진행

추가 예외처리
1. if(target.Length == 1) 1일때 idx = 0부터 시작하면 한번은 돌게되니까 바로 빠져나올수있도록 상단에서 리턴해줘야한다.
2.if(idx == target.Length-1)
2-1. if(matchCase == notMatchCase)
문자열의 마지막 요소까지 돌아서 일치한 상태이기 때문에, 더 이상 반복하지 않고 +1을 리턴한다.
2-2. else
즉 끝까지 돌았음에도 일치하지 않는 경우, 그 문자열 자체가 묶음이 되어야 하므로 +1을 리턴해주면된다.

**
반복을 돌때 idx = 0부터 돌면서 요소를 비교했는데, 어차피 비교군이되는 문자 요소는 기준 문자열의 첫번째 요소기때문에 idx 와 matchCase 는 1부터 시작하는게 나은듯하다..


using System;

public class Solution {
    
    public int solution(string s) {
        int answer = func(s);
        return answer;
    }
    
   public int func(string target, int result = 0)
        {
            if(target.Length == 1) {  
                result += 1;
                return result;
            };

            string x = target[0].ToString();
            int matchCase = 0;
            int notMatchCase = 0;

            for(int idx = 0; idx < target.Length; idx++)
            {
                if(target.Length == 1) return result; 
                
                if(target[idx].ToString().Equals(x))
                {
                      matchCase += 1; 
                }
                else 
                {
                    notMatchCase += 1;
                }

               if(matchCase == notMatchCase)
                {
                   result += 1;
                   if(idx == target.Length - 1 )
                       return result;
                   
                   string tmp = target.Substring(idx + 1);
                   return func(tmp, result);
                }
                
                if(idx == target.Length-1) 
                {
                    return result += 1;
                }
            }                    
            return result;
        }
}

0개의 댓글