58청춘 2024. 9. 30. 23:40
728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 

풀이

이 문제.... 쉽지 않았다...

처음에는 Map 객체를 이용해 구현했는데, 테스트 케이스는 통과하지만 정답은 아니였다.

function solution(n, k, cmd) {
  const map = new Map();
  const del = [];

  for (let i = 0; i < n; i++) {
    map.set(i, "O");
  }

  for (let i = 0; i < cmd.length; i++) {
    if (cmd[i] === "C") {
      map.set(k, "X");
      del.push(k);
      if (map.size > k + 1) {
        if (map.get(k + 1) !== 'X') {
          while (map.get(k + 1) !== 'O') {
            k++;
          }
        }
        else {
          while (map.get(k - 1) !== 'O') {
            k--;
          }
        }
      }
    }
    else if (cmd[i] === "Z") {
      const last = del.pop();
      map.set(last, 'O');
    }
    else {
      let [c, d] = cmd[i].split(' ');
      for (let j = 1; j <= d; j++) {
        if (map.get(k + i) === 'X') d++;
      }
      c === "D" ? k += +d : k -= +d;
    }
  }
  return [...map].reduce((acc, cur) => acc + cur[1], '');
}

 

그렇다면 이렇게 하나가 빈 빵꾸? 가 나면 다른 연결된 곳으로 이동하는 자료구조.... 그것은 링크드리스트......

 

객체로 링크드 리스트를 구현하고 이를 이용해 각 표들의 연결을 구성해야한다.

 

코드

function solution(n, k, cmd) {
    const linked = {
        0: [undefined, 1]
    };
    const state = Array.from({ length: n }, () => true)
    const del = [];
    
    for (let i = 1; i < n; i++) {
        if (i === n - 1) linked[i] = [i - 1, undefined];
        else linked[i] = [i - 1, i + 1];
    }
    
    for (let i = 0; i < cmd.length; i++) {
        if (cmd[i] === "C") {
            const [prev, next] = linked[k];
            if (prev === undefined) {
                linked[next][0] = undefined;
            }
            else if (next === undefined) {
                linked[prev][1] = undefined;
            }
            else {
                linked[prev][1] = next;
                linked[next][0] = prev;
            }
            del.push(k);
            state[k] = false;
            k = linked[k][1] ? linked[k][1] : linked[k][0]
        }
        else if (cmd[i] === "Z") {
            const re = del.pop();
            const [prev, next] = linked[re];
            if (prev === undefined) {
                linked[next][0] = re;
            }
            else if (next === undefined) {
                linked[prev][1] = re;
            }
            else {
                linked[prev][1] = re;
                linked[next][0] = re;
            }
            state[re] = true;
        }
        else {
            let [c, d] = cmd[i].split(' ');
            if (c === 'D') {
                for (let j = 0; j < +d; j++) {
                    k = linked[k][1];
                }
            }
            else {
                for (let j = 0; j < +d; j++) {
                    k = linked[k][0];
                }
            }
        }
    }
    return Array.from({ length: n }, (_, i) => state[i] ? 'O' : 'X').join('');
}
728x90