본문 바로가기

알고리즘/test

javascript) 프로그래머스 - 문자열 나누기

https://school.programmers.co.kr/learn/courses/30/lessons/140108#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제:

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

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

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

제한사항:

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

실행코드

function solution(s) {
    let stack = [];
    let count = 0;
    
    for (let i = 0; i < s.length ; i++){
        stack.push(s[i]);
        
        const same = stack.filter((item) => item === stack[0]);
        const notSame = stack.filter((item) => item !== stack[0]);
        
        if(same.length === notSame.length){
            count += 1;
            stack = [];
        }
    }
    
    if (stack.length !== 0){
        count += 1;
    }
    return count;
}

stack에 문자를 넣어줍니다. 스택 가장 아래에 있는 문자가 기준이 되는 문자 입니다.

filter()를 통해 기준 글자와 같은 배열, 같지 않은 배열을 생성합니다.

이 둘의 길이가 같다면, 문제 조건에 부합하므로 count를 1 증가시킵니다.

다음 케이스를 판별하기 위해 스택을 초기화 시켜줍니다.

주어진 문자열의 끝까지 이를 반복합니다.

 

만약, 스택에 값이 남아있다면 처리되지 않은 문자열이므로, 이들은 하나의 문자열로 봅니다. 따라서, count가 1 증가 합니다.

count는 곧 분해한 문자열의 개수 입니다.

 

Array.filter() 는 JavaScript에서 배열의 각 요소를 테스트하여 콜백 함수의 결과가 true인 요소만을 모아 새로운 배열을 만드는 메소드입니다.

ex)

const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = numbers.filter(number => number % 2 === 0);
console.log(evenNumbers); // Output: [2, 4, 6]