문자열 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;
}
}