[Problem Solving] 문자열 나누기

Sean·2022년 12월 29일
0

Problem Solving

목록 보기
7/130

문제

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

통과한 코드

아이디어

주어진 문자열 s를 순회하며 다음과 같이 반복문에서 처리한다.

가장 중요한 것은 마지막 if문인데, 여기 조건이 정답을 맞추기에 좀 까다로웠다.
특수 case들 때문에 마지막 if문을 사용했는데, 예를 들면 다음과 같은 s들에 대해서 고려해주어야 한다.

  • "bbbbbbbbbb"와 같은 문자열
    • x_cnt는 엄청 카운트됐지만 문자열이 나눠진 적이 없는 경우
  • "bbbbbaabbbb"와 같은 문자열
    • x_cntother_cnt가 각각 카운트되긴 했지만 문자열이 나눠질 수 없는 경우

또한, 나는 실제로 문자열을 나누지 않고 그냥 나눠진 횟수만 카운트 해주었다. (실제로 그래도 상관 없다. 나눠진 문자열 조각들을 리턴하는 게 아닌 이상)

코드

function solution(s) {
    var answer = 0;
    var x_cnt = 0, other_cnt = 0;
    var x = s[0];
    
    for(let i=0; i<s.length; i++) {
        s[i] == x ? x_cnt++ : other_cnt++;
        
        if(x_cnt == other_cnt) {
            answer++;
          	//문자열이 나눠진 효과를 내기 위해서 카운트를 다시 0으로 초기화
            x_cnt = 0, other_cnt = 0;
          	//새로운 x를 미리 지정하여 반복문 윗단에서 카운트 할 수 있게 세팅
            x = s[i+1];
        }
        if(i == s.length-1 && other_cnt >= 0 && x_cnt >= 1) {
            answer++;
        }
    }
    
    return answer;
}
profile
여러 프로젝트보다 하나라도 제대로, 깔끔하게.

0개의 댓글