diff --git "a/Programmers/Level1/64061_\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.js" "b/Programmers/Level1/64061_\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.js" index 27782f3..85bbbd8 100644 --- "a/Programmers/Level1/64061_\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.js" +++ "b/Programmers/Level1/64061_\355\201\254\353\240\210\354\235\270_\354\235\270\355\230\225\353\275\221\352\270\260_\352\262\214\354\236\204.js" @@ -5,8 +5,33 @@ 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/64061 */ +// ANCHOR 2025.12.03 풀이 +function solution3(board, moves) { + const boardStack = Array.from({ length: board.length }, () => new Array()); + board.reverse().forEach((row) => { + for (let idx = 0; idx < row.length; idx++) { + row[idx] && boardStack[idx].push(row[idx]); + } + }); + + const basket = []; + let answer = 0; + for (let idx = 0; idx < moves.length; idx++) { + const target = boardStack[moves[idx] - 1].pop(); + if (!target) continue; + if (basket.length > 0 && target === basket[basket.length - 1]) { + basket.pop(); + answer += 2; + } else { + basket.push(target); + } + } + + return answer; +} + // ANCHOR 2025.10.03 풀이 -function solution(board, moves) { +function solution2(board, moves) { const boardSize = board.length; const topIdxs = new Array(board.length); const basket = []; diff --git "a/Programmers/Level2/42584_\354\243\274\354\213\235\352\260\200\352\262\251.js" "b/Programmers/Level2/42584_\354\243\274\354\213\235\352\260\200\352\262\251.js" index 2f9ae1b..9deac04 100644 --- "a/Programmers/Level2/42584_\354\243\274\354\213\235\352\260\200\352\262\251.js" +++ "b/Programmers/Level2/42584_\354\243\274\354\213\235\352\260\200\352\262\251.js" @@ -5,6 +5,27 @@ 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42584 */ +// ANCHOR 2025.12.03 풀이 +function solution3(prices) { + const stack = []; + const answer = Array(prices.length).fill(0); + + for (let idx = 0; idx < prices.length; idx++) { + while (stack.length > 0 && prices[stack[stack.length - 1]] > prices[idx]) { + const top = stack.pop(); + answer[top] = idx - top; + } + stack.push(idx); + } + + while (stack.length > 0) { + const top = stack.pop(); + answer[top] = prices.length - top - 1; + } + + return answer; +} + // ANCHOR 2025.10.03 풀이 function solution2(prices) { const answer = new Array(prices.length); diff --git "a/Programmers/Level3/81303_\355\221\234_\355\216\270\354\247\221.js" "b/Programmers/Level3/81303_\355\221\234_\355\216\270\354\247\221.js" index e131fe9..5bcdf86 100644 --- "a/Programmers/Level3/81303_\355\221\234_\355\216\270\354\247\221.js" +++ "b/Programmers/Level3/81303_\355\221\234_\355\216\270\354\247\221.js" @@ -11,6 +11,66 @@ * - 이중 연결 리스트로 구현해서 해결 완료 */ +// ANCHOR - 2025.12.03 풀이 + +function solution3(n, k, cmd) { + const row = Array.from({ length: n }, (_, idx) => ({ + prev: idx === 0 ? null : idx - 1, + isDeleted: false, + next: idx === n - 1 ? null : idx + 1, + })); + + const deleted = []; + let cur = k; + for (let idx = 0; idx < cmd.length; idx++) { + const [op, argstr] = cmd[idx].split(" "); + const arg = Number(argstr); + switch (op) { + case "U": + for (let cnt = 0; cnt < arg; cnt++) { + cur = row[cur].prev; + } + break; + case "D": + for (let cnt = 0; cnt < arg; cnt++) { + cur = row[cur].next; + } + break; + case "C": + // 현재 선택된 행을 삭제 + row[cur].isDeleted = true; + deleted.push(cur); + // 현재 선택된 행이 가장 마지막 행인 경우 현재 행을 그 위 행으로 + if (row[cur].next === null) { + cur = row[cur].prev; + if (cur !== null) row[cur].next = null; + } else { + // 그 외에는 아래 행 선택 + if (row[cur].prev !== null) row[row[cur].prev].next = row[cur].next; + row[row[cur].next].prev = row[cur].prev; + cur = row[cur].next; + } + break; + case "Z": + // 최근에 삭제된 것 복구 + const deletedIdx = deleted.pop(); + if (deletedIdx === undefined) break; + if (row[deletedIdx].prev !== null) + row[row[deletedIdx].prev].next = deletedIdx; + if (row[deletedIdx].next !== null) + row[row[deletedIdx].next].prev = deletedIdx; + row[deletedIdx].isDeleted = false; + break; + } + } + + const answer = row.reduce( + (acc, { isDeleted }) => (acc += isDeleted ? "X" : "O"), + "" + ); + return answer; +} + // ANCHOR - 2025.10.04 풀이 - 이중 연결 리스트 function solution2(n, k, cmd) { // 각 노드가 가리키는 prev와 next를 저장하는 배열 (이중 연결 리스트)