코딩 테스트/프로그래머스 코딩 테스트 연습
[JS] 표편집
58청춘
2024. 9. 30. 23:40
728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/81303#
풀이
이 문제.... 쉽지 않았다...
처음에는 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