본문 바로가기
Coding Test

231130 문자열 나누기 - Level 1

by mmm- 2023. 11. 30.

문제 설명

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

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

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

 

제한사항

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

 

입출력 예

 

입출력 예 설명

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

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

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


코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        char[] sArr = new char[s.length()];
        int xCnt = 1, otherCnt = 0;
        char x = '0';

        sArr = s.toCharArray();
        x = sArr[0];
        
        for(int i=1; i<s.length(); i++) {
            if(sArr[i] == x)
                xCnt++;
            else
                otherCnt++;
            
            if(xCnt == otherCnt) {
                if(i<s.length()-1)
                    x = sArr[i+1];
                answer++;
                xCnt = 0;
                otherCnt = 0;
            }
        }
        
        if(xCnt != 0)
            answer++;
        
        return answer;
    }
}

 

풀이

xCnt = x가 나오는 횟수, otherCnt = x가 아닌 다른 문자가 나오는 횟수

for문을 돌려줄 때 1부터 시작되기 때문에 xCnt는 1로 초기화해줬다. 문자열 s를 char형 배열로 변환하여 sArr에 담아준다. 첫번째 글자가 x라고 했기 때문에 x에 sArr[0]를 할당해준다. 1부터 s의 길이보다 작을 때까지 for문을 돌려 sArr의 i번째에 위치한 값이 x면 xCnt를 증가시켜주고, 그렇지 않으면 otherCnt를 증가시켜준다. 그리고 xCnt와 otherCnt의 크기가 같으면 i가 s의길이-1보다 작을 때는 sArr[i+1]을 x에 넣어준다. 그 이유는 이미 확인한 문자는 s에서 제외시키는 로직을 구현하기 위해서 첫번째 글자인 x를 변경해주는 것이다. 그리고 xCnt와 otherCnt가 같으면 answer를 증가시켜주고, cnt관련 변수를 0으로 초기화해준다. for문이 종료되었는데도 불구하고 xCnt가 0이 아니라면 다른 상태에서 더 이상 읽을 글자가 없다는 것을 의미하기 때문에 answer을 증가시켜준다.

'Coding Test' 카테고리의 다른 글

231212 폰켓몬 - Level 1  (0) 2023.12.12
231209 완주하지 못한 선수 - Level 1  (0) 2023.12.09
231129 체육복 - Level 1  (1) 2023.11.29
231128 로또 최고 순위와 최저 순위 - Level 1  (1) 2023.11.28
231127 덧칠하기 - Level 1  (2) 2023.11.27