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

이 문제는 문자열을 주어진 규칙에 따라 여러 부분으로 분해하고, 분해된 문자열의 개수를 구하는 문제이다.
문자열을 첫 글자를 기준으로 나누고 그에 따라 조건이 충족되는 시점마다 분리하는 과정을 반복하여 최종적으로 분해된 문자열의 개수를 구하기만 하면 된다.
1. 문제 정의
- 첫 글자를 읽고, 이 글자를 x라고 정의한다.
- 문자열을 왼쪽에서 오른쪽으로 읽어나가면서 x의 개수와 x가 아닌 다른 문자의 개수를 각각 센다
- 두 개수가 같아지는 순간까지 읽은 부분을 하나의 문자열로 분리한다
- 나머지 문자열에 대해 동일한 과정을 반복합니다. 남은 문자열이 없으면 종료한다
- 만약 문자열을 다 읽었는데도 두 개수가 같지 않다면, 현재까지 읽은 부분을 하나의 문자열로 처리하고 종료한다.
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; // 최종 분리된 문자열 개수 반환
}
이 문제는 문자열을 첫 글자를 기준으로 두 개수의 균형이 맞을 때마다 분리하는 문제였다.
사실 크게 어렵지 않고 그냥 첫 글자와 나머지 문자의 개수를 비교하여 조건이 만족될 때마다 확인 조건을 초기화하면서 카운드하여 해결할 수 있었다.
'SOLVED.' 카테고리의 다른 글
[프로그래머스] 구명보트 (JS) (0) | 2025.03.03 |
---|---|
[프로그래머스] 기사단원의 무기 (JS) (+ 약수 구하는 최적의 알고리즘) (0) | 2024.12.02 |
[프로그래머스 Level 1] 과일 장수 (JS) (1) | 2024.11.19 |
[프로그래머스 Level 2] 방문 길이 (JS) (2) | 2024.11.06 |
[프로그래머스 Level 3] 입국심사 (JS) (0) | 2024.11.05 |