[알고리즘]-문자열 나누기

dev_woo·2024년 12월 30일
post-thumbnail

요약

문제 풀이 시간 : 16분 31초

풀이 
기준 문자 열과 카운팅을 얼마나 효율적으로 처리하는지가 중요
1. 설명이 길수록 핵심만 정리하기
2. 기준 문자와 아닌것 나눠서 카운팅 -> ++, -- 로 0 일떄로 간단히 표현도 가능 
// 명확히 구분해서 표현하는게 가독성이 더 좋아보임 
3. 삼항연산자 와 for...of 문을 통한 가독성 개선

문제 설명

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

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

제한사항

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

풀이

// s : 문자열

// 목표 
// 문자열들을 분해하고 분해한 문자열의 개수를 return

// 규칙
// 1 : 첫글자를 읽고 x라고 함
// 2 : 문자열을 왼쪽에서 오른쪽으로 읽어나가면서 x 와 다른 단어들이 나온 횟수를 카운트함
//      처음으로 두 숫자가 같아졋을때, 멈추고 문자열을 분리함
// 3 : s에서 분리한 문자열을 뺴고 남은 부분에서 이 과정을 반복함, 남은 부분이 없다면 종료
// 4 : 두 횟수가 다른 상태에서 더이상 읽을 글자가 없다면, 분리하고 종료

// 풀이
// 1. 첫 문자열 x 를 설정
// 2. 반복문을 반복하면서, x 의 카운트와 x가 아닌 문자의 카운트를 체크
// 3. x 와 notX 의 갯수가 같아졌을때, 문자열을 반환하고, 다음 작업 실시 -> x 갱신 및 count 갱싱
// 4. 남은 문자열 처리

function solution(s) {
    const arr = [...s];
    let count = 0; // 분리된 문자열의 개수
    let countX = 0; // x와 같은 글자의 개수
    let countNotX = 0; // x와 다른 글자의 개수
    let x = ""; // 현재 기준 문자

    for (let i = 0; i < arr.length; i++) {
        if (countX === 0 && countNotX === 0) {
            // 새로운 기준 문자 설정
            x = arr[i];
        }

        // 기준 문자와 같은 경우
        if (arr[i] === x) {
            countX++;
        } else {
            // 기준 문자와 다른 경우
            countNotX++;
        }

        // 분리 조건: countX와 countNotX가 같아질 때
        if (countX === countNotX) {
            count++; // 분리 개수 증가
            countX = 0; // 카운터 초기화
            countNotX = 0;
        }
    }

    // 남은 문자열 처리
    if (countX !== 0 || countNotX !== 0) {
        count++;
    }

    return count;
}

해당 문제는 어떻게 효율적으로 각 문자의 갯수를 카운팅하는지가 핵심인 문제였습니다.
먼저 문자열을 순회하면서, 기준 문자를 설정했습니다. 이후 문자 개수를 카운팅하여 카운팅 갯수가 일치하는지 여부를 확인했습니다. 이후 카운팅을 초기화하고, 남은 문자열을 처리하는 방식으로 코드를 작성했습니다.

profile
꾸준히 한걸음씩

0개의 댓글