SOLVED.

[프로그래머스] 문자열 나누기 (JS)

healim01 2024. 11. 26. 14:50
반응형

문자열 나누기 문제: 규칙에 따라 문자열을 분해하는 방법

 

이 문제는 문자열을 주어진 규칙에 따라 여러 부분으로 분해하고, 분해된 문자열의 개수를 구하는 문제이다. 

 

문자열을 첫 글자를 기준으로 나누고 그에 따라 조건이 충족되는 시점마다 분리하는 과정을 반복하여 최종적으로 분해된 문자열의 개수를 구하기만 하면 된다. 

 

 

1. 문제 정의

  1. 첫 글자를 읽고, 이 글자를 x라고 정의한다. 
  2. 문자열을 왼쪽에서 오른쪽으로 읽어나가면서 x의 개수와 x가 아닌 다른 문자의 개수를 각각 센다
  3. 두 개수가 같아지는 순간까지 읽은 부분을 하나의 문자열로 분리한다
  4. 나머지 문자열에 대해 동일한 과정을 반복합니다. 남은 문자열이 없으면 종료한다
  5. 만약 문자열을 다 읽었는데도 두 개수가 같지 않다면, 현재까지 읽은 부분을 하나의 문자열로 처리하고 종료한다. 

 

2. 문제 해결 과정

문자열을 차례로 읽으면서 특정 조건이 만족되는 시점마다 문자열을 분리하는 방식이기 때문에 첫 글자를 기준으로 카운팅하면서 조건을 체크하기로 했다. 조건이 만족될 때마다 분리하고 문자열을 초기화하는 방식으로 문제를 풀었다. 

 

1. 첫 글자와 나머지 문자 카운팅

문자열의 첫 글자를 x로 정의한 후, x의 개수(xCnt)와 그 외 문자들의 개수(yCnt)를 카운트한다. 

두 개수가 같아지는 순간 문자열을 분리하고, 다음 문자열로 넘어가 다시 카운트를 시작한다. 

 

2. 문자열 분리

두 개수가 같아질 때마다 분리된 문자열의 개수를 하나씩 증가시킵니다.

여기서 분리된 문자열이 무엇인지 사실 궁금하지 않으니 그냥 숫자만 증가시켜도 된다. 

 

만약 문자열을 끝까지 읽었는데도 두 개수가 같지 않다면, 그때까지 읽은 문자열도 마지막에 하나의 부분으로 분리해야한다. 

그 상황을 x 가 존재하는데 초기화 안되었을 때라고 판단했다. 

 

 

3. 코드 구현

function solution(s) {    
    let x = null; // 첫 글자 저장
    let word = 0; // 분리된 문자열 개수
    
    // 첫 글자와 나머지 문자의 개수 카운트
    let xCnt = 0, yCnt = 0;
    
    // 문자열을 하나씩 읽음
    Array.from(s).forEach((a) => {
        if (x === null) x = a; // 첫 글자를 x로 설정
        
        if (a === x) xCnt++; // 첫 글자와 같은 문자일 경우
        else yCnt++; // 다른 문자일 경우
        
        // x와 다른 문자의 개수가 같아지면 문자열 분리
        if (xCnt === yCnt) {
            word++; // 분리된 문자열 개수 증가
            x = null; // 첫 글자 초기화
            xCnt = 0; // 카운트 초기화
            yCnt = 0; // 카운트 초기화
        }
    });
    
    // 아직 분리되지 않은 문자열이 남아있는 경우
    if (x !== null) word++;
    
    return word; // 최종 분리된 문자열 개수 반환
}

 

이 문제는 문자열을 첫 글자를 기준으로 두 개수의 균형이 맞을 때마다 분리하는 문제였다.

사실 크게 어렵지 않고 그냥 첫 글자와 나머지 문자의 개수를 비교하여 조건이 만족될 때마다 확인 조건을 초기화하면서 카운드하여 해결할 수 있었다. 

반응형