ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 110 옮기기(javascript)
    카테고리 없음 2022. 10. 13. 21:57
    728x90

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

     

    프로그래머스

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

    programmers.co.kr

    문제 설명

    0과 1로 이루어진 어떤 문자열 x에 대해서, 당신은 다음과 같은 행동을 통해 x를 최대한 사전 순으로 앞에 오도록 만들고자 합니다.

    • x에 있는 "110"을 뽑아서, 임의의 위치에 다시 삽입합니다.

    예를 들어, x = "11100" 일 때, 여기서 중앙에 있는 "110"을 뽑으면 x = "10" 이 됩니다. 뽑았던 "110"을 x의 맨 앞에 다시 삽입하면 x = "11010" 이 됩니다.

    변형시킬 문자열 x가 여러 개 들어있는 문자열 배열 s가 주어졌을 때, 각 문자열에 대해서 위의 행동으로 변형해서 만들 수 있는 문자열 중 사전 순으로 가장 앞에 오는 문자열을 배열에 담아 return 하도록 solution 함수를 완성해주세요.


    제한사항
    • 1 ≤ s의 길이 ≤ 1,000,000
    • 1 ≤ s의 각 원소 길이 ≤ 1,000,000
    • 1 ≤ s의 모든 원소의 길이의 합 ≤ 1,000,000

    입출력 예sresult
    ["1110","100111100","0111111010"]

    풀이

    stack을 이용하였습니다. 문자열에 0이 들어올때마다 앞에 11이 있는지 확인하며 있다면 제거합니다.

    110은 111을 제외한 모든 숫자보다 큽니다. 즉, 0보다 무조건 뒤에 위치해야 합니다.

    두번째 예제를 예로

    첫 for문을 돌고나면 stack은 [1, 0, 0] str은 '110110'이 됩니다.

    여기서 마지막 0의 index를 찾고 그뒤에 이어붙여주면 됩니다. 

    전체 코드

    function solution(s) {
      var answer = s.map((v) => {
        const stack = [];
        let str = "";
        for (const right of v) {
          if (stack.length > 1) {
            const mid = stack.pop();
            const left = stack.pop();
            `${left}${mid}${right}` === "110" ? (str += "110") : stack.push(left, mid, right);
          } else {
            stack.push(right);
          }
        }
    
        const baseStr = stack.join("");
        const zeroIdx = baseStr.lastIndexOf("0") + 1;
        return zeroIdx === -1
          ? str + baseStr
          : baseStr.slice(0, zeroIdx) + str + baseStr.slice(zeroIdx);
      });
      return answer;
    }
    
    solution(["1110", "100111100", "0111111010"]);
    728x90

    댓글

Designed by Tistory.