๋ฌธ์
๋ฌธ์ ํด๊ฒฐ์ ์ํ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ๋ ๊ฒ์ ์ด๋ ต์ง ์์ต๋๋ค. ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ดํดํ๊ธฐ ์ฝ๊ณ ๊ตฌํํ๊ธฐ๋ ๊ฐ๋จํฉ๋๋ค. ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ ๋ ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค.
์ด๋ฌํ ๋นํจ์จ์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Doubly Linked List)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ฐ ๋ ธ๋๊ฐ ์๋ค ๋ ธ๋๋ฅผ ๋ชจ๋ ์ฐธ์กฐํ๋ ๊ตฌ์กฐ๋ก, ๋ฐ์ดํฐ์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋งค์ฐ ํจ์จ์ ์ ๋๋ค. ์ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ์์๋ฅผ ์ ๊ฑฐํ ๋, ๋จ์ํ ์ธ์ ํ ๋ ธ๋๋ค์ ์ฐธ์กฐ๋ง ์์ ํ๋ฉด ๋๋ฏ๋ก O(1)์ ์๊ฐ ๋ณต์ก๋๋ก ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋ํ, ํด๋น ๋ฌธ์ ์๋ ๋ณต๊ตฌ ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๋๋ฐ ์คํ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
๋์ ํ์ด
- ์๊ฐ๋ณต์ก๋: O(N)
class Node {
constructor(data) {
this.data = data;
this.prev = null;
this.next = null;
}
}
function solution(n, k, cmd) {
// ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ด๊ธฐํ
let current = new Node(0);
let root = current;
for (let i = 1; i < n; i++) {
let newNode = new Node(i);
current.next = newNode;
newNode.prev = current;
current = newNode;
}
// k๋ฒ์งธ ๋
ธ๋๋ก ์ด๋
current = root;
for (let i = 0; i < k; i++) {
current = current.next;
}
const stack = [];
const deleted = new Array(n).fill(false);
for (const command of cmd) {
const [action, value] = command.split(' ');
switch (action) {
case 'U':
for (let i = 0; i < parseInt(value); i++) {
current = current.prev;
}
break;
case 'D':
for (let i = 0; i < parseInt(value); i++) {
current = current.next;
}
break;
case 'C':
stack.push(current);
deleted[current.data] = true;
const prev = current.prev;
const next = current.next;
if (prev) prev.next = next;
if (next) next.prev = prev;
// ๋ง์ง๋ง ํ์ธ ๊ฒฝ์ฐ, ์ ํ ์ ํ
if (!next) {
current = prev;
} else {
current = next;
}
break;
case 'Z':
const restored = stack.pop();
deleted[restored.data] = false;
const prevNode = restored.prev;
const nextNode = restored.next;
if (prevNode) prevNode.next = restored;
if (nextNode) nextNode.prev = restored;
break;
}
}
return deleted.map(d => d ? 'X' : 'O').join('');
}
๋ค๋ฅธ ํ์ด
- ์๊ฐ๋ณต์ก๋: O(N)
๋ ธ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ธ๋ฑ์ค๋ง์ ์ฌ์ฉํ์ฌ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์๋ ์์ต๋๋ค.
function solution(n, k, cmd) {
// โ ์ญ์ ๋ ํ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ ๋ฆฌ์คํธ
const deleted = [];
// โ ๋งํฌ๋ ๋ฆฌ์คํธ์์ ๊ฐ ํ ์์๋์ ํ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ ๋ฆฌ์คํธ
const up = [...new Array(n + 2)].map((_, i) => i - 1);
const down = [...new Array(n + 1)].map((_, i) => i + 1);
// โ ํ์ฌ ์์น๋ฅผ ๋ํ๋ด๋ ์ธ๋ฑ์ค
k += 1;
// โ ์ฃผ์ด์ง ๋ช
๋ น์ด(cmd) ๋ฆฌ์คํธ๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌ
for (const item of cmd) {
// โ ํ์ฌ ์์น๋ฅผ ์ญ์ ํ๊ณ ๊ทธ๋ค์ ์์น๋ก ์ด๋
if (item.startsWith("C")) {
deleted.push(k);
up[down[k]] = up[k];
down[up[k]] = down[k];
k = n < down[k] ? up[k] : down[k];
}
// โ ๊ฐ์ฅ ์ต๊ทผ์ ์ญ์ ๋ ํ์ ๋ณต์
else if (item.startsWith("Z")) {
const restore = deleted.pop();
down[up[restore]] = restore;
up[down[restore]] = restore;
}
// โ U ๋๋ D๋ฅผ ์ฌ์ฉํด ํ์ฌ ์์น๋ฅผ ์์๋๋ก ์ด๋
else {
const [action, num] = item.split(" ");
if (action === "U") {
for (let i = 0; i < num; i++) {
k = up[k];
}
} else {
for (let i = 0; i < num; i++) {
k = down[k];
}
}
}
}
// โ ์ญ์ ๋ ํ์ ์์น์ 'X'๋ฅผ, ๊ทธ๋ ์ง ์์ ํ์ ์์น์ 'O'๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด ๋ฐํ
const answer = new Array(n).fill("O");
for (const i of deleted) {
answer[i - 1] = "X";
}
return answer.join("");
}
Reference
'๐ข Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript][Programmers] ๊ธฐ๋ฅ ๊ฐ๋ฐ (0) | 2024.08.16 |
---|---|
[Javascript][๋ฐฑ์ค] 1158๋ฒ - ์์ธํธ์ค ๋ฌธ์ (0) | 2024.08.15 |
[Javascript][Programmers] ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ฒ์ (0) | 2024.08.05 |
[Javascript][Programmers] ์ฃผ์ ๊ฐ๊ฒฉ (0) | 2024.08.03 |
[Javascript][Programmers] ๊ดํธ ํ์ ํ๊ธฐ (0) | 2024.08.01 |