๋ค์ด๊ฐ๋ฉฐ
- ๋ฌธ์ ๋ฅผ ํ ๋ ๋ฌธ์ ์ ์ ํ๋์ ํจ์จ์ฑ์ ๊ณ ๋ คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์๊ฐํด ๋ด๋๊ฒ ์ฝ์ง ์๋ค.
- ์ด๋ฒ ์คํฐ๋์์ ์คํ,ํ๋ฅผ ์งํํ๋ฉด์ ์ฝ๋ฉํ ์คํธ ํฉ๊ฒฉ์๋๊ธฐ์ ์๋ก ๋์ด ์๋ ๋ฌธ์ ์ธ 2021 ์นด์นด์ค ์ฑํ ์ฐ๊ณํ ์ธํด์ฝ ๋ฌธ์ "ํ ํธ์ง"์์ ๋ถ๋ถ์ ์ผ๋ก ์คํ์ ์ด์ฉํ์์ง๋ง ๊ฒฐ๊ตญ์ ํจ์จ์ฑ ๋ถ๋ถ์์ ์ ํ์ด๋ด์ง ๋ชปํ๋ค.
- ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ด์ ์ ํจ์จ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ ์ ์๋ ์ด์ ๋ฅผ ๋ณต๊ธฐํ๋ฉฐ ๊ธ์ ์ฐ๋ ค๊ณ ํฉ๋๋ค
- ๊ณจ๋ ๋๋น ์ฝ๋ฉ ํ ์คํธ ํฉ๊ฒฉ์ ๋๊ธฐ ํ์ด์ฌ ํธ์ 6์ฅ ~ 7์ฅ ์จ๋จธ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์คํ
๋จผ์ ์คํ์ ๋ํด ์์๋ณด์.
- ์คํ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ์๋ก๋ ํฐ์๋ฅผ ์๊ฐํ ์ ์๋ค.
- ํฐ์๋ฅผ ์ฒ์ ๋ง๋ค ๋ ๋จผ์ ๋ฃ์ ํฐ์๊ฐ ๊ฐ์ฅ ์๋์ ์์นํ๋ค.
- ํฐ์๋ฅผ ๋ค ๋ง๋ค๊ณ ๋์ ์ฌ์ฉํ ๋์๋ ๋งจ ์์ ์๋ ํฐ์ ๋ถํฐ ๋ฝ์ผ๋ฏ๋ก, ๊ฐ์ฅ ๋์ค์ ๋ฃ์ ํฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ๋จผ์ ๋ค์ด๊ฐ ๊ฒ์ด ๋ง์ง๋ง์ ๋์ค๋ ๊ท์น์ ๊ฐ๊ณ ์๋ค. (= ์ ์ ํ์ถ, First In Last Out, FIFO)
์คํ์ ADT
์ ์ | ์ค๋ช | ๋ฆฌํด ํ์ |
---|---|---|
isFull() | ์คํ์ ๋ค์ด ์๋ ๋ฐ์ดํฐ ๊ฐ์๊ฐ maxsize๋ผ๋ฉด True, ์๋๋ฉด False | boolean |
isEmpty() | ์คํ์ ๋ค์ด ์๋ ๋ฐ์ดํฐ๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด False, ์๋๋ฉด True | boolean |
push(ItemType item) | ์คํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ค. | void |
pop() | ์คํ์์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ฃ์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ. | Item Type |
top | ์คํ์์ ์ต๊ทผ ํธ์ํ ๋ฐ์ดํฐ์ ์์น | Int |
2021 ์นด์นด์ค ์ฑํ ์ฐ๊ณํ ์ธํด์ญ ํ ํธ์ง
๋์ ์ ๊ทผ๋ฒ
๋ด๊ฐ ํผ ๋ฌธ์ ์ ์ ๊ทผ ๋ฐฉ๋ฒ์, index๋ฅผ ์ด์ฉํ์ฌ up, down์ ์ด๋์ ํ๊ณ , ์ญ์ ์ ๊ฒฝ์ฐ javascript์ delete ์ฐ์ฐ์ ์ด์ฉํ์ฌ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์์์ฑ undefined
๋ก ๋ณ๊ฒฝ ํ ํ, index๋ฅผ ๋ฌธ์ ์กฐ๊ฑด์ ๋ง์ถ์ด ์, ์๋๋ก ๋ณ๊ฒฝํ์๋ค.
delete์ ์ค์ํ์ ์ ๋ณต๊ตฌํ ๋ ๊ฐ์ฅ ์ต์ ์ ์ง์ด ํ์ ๋ค์ ๊ธฐ์ตํด์ผ ํ๋ฏ๋ก, delete ๋ฐ๋ก ์ stack์ ํ์์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
๋์ ๊ฒฝ์ฐ deletedStack = [[ํ์ index, value]] ๋ก ์ ์ฅํ๋ค.
๊ทธ๋์ ๋ณต๊ตฌ์ ๊ฒฝ์ฐ deletedStack์ pop ํ์ฌ ๊ธฐ์กด ๋ฐฐ์ด์ undefined
๋ก ๋์ด ์๋ ์์๋ฅผ row[index] = value
๋ก ์ฌํ ๋น ํด์ฃผ์๋ค.
ํ์ง๋ง ์ ํ๋ 29/30์ ํจ์จ์ฑ 5/10 ์ผ๋ก ์ฑ๋ฅ์ ๋ฐ๊พธ๋ ค ์ด๋ฆฌ์ ๋ฆฌ ์๋ํ์ง๋ง, ๊ฒฐ๊ตญ ๋พฐ์กฑํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฐพ์ ์ ์์๋ค. ์ฒ์ ์๋ํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
๋ด ์ฝ๋์ ๋ฌธ์ ์ ์
๋ฐฐ์ด์์ ์ญ์ ํ, up, down์ ํ ๋ ๋ชจ๋ ์์๋ค์ ์ํํ๋ฉด์
undefined
๊ฐ ์์ผ๋ฉด count์ ํฌํจํ์ง ์๋ ๋ฐฉ์์ผ๋ก, ๋ชจ๋ ์์๋ฅผ ์ํํ๋ค๋ ์ ์ด๋ค.์ญ์ ๋์์ ๋, ์ญ์ ๋ ํ์ด ๋ฐฐ์ด์ ๋ง์ง๋ง์ผ ๊ฒฝ์ฐ, ์ ํ๋ ํ์ ์ญ์ ๋ ํ์ ๋ฐ๋ก ์์ ์์น์ ์๋ ํ์ผ๋ก ๋ณ๊ฒฝ ํด์ผ ํ๋๋ฐ, ์ด ๊ณผ์ ์์ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์์์ผ๋ฏ๋ก, ๋ฐฐ์ด์ ๋ง์ง๋ง ํ์ด
undefined
๊ฐ ์๋ ํ์ ๋ ์ฐพ๊ธฐ ์ํด ์ํ๋ฅผ ํด์ผ ํ๋ค๋ ์ ์ด๋ค.
/**
* ์ ํ์ฑ: 29/30, ํจ์จ์ฑ 5/10
* @param {*} n
* @param {*} k
* @param {*} cmd
* @returns
*/
function solution(n, k, cmd) {
var answer = "";
let current = k;
let row = Array.from({ length: n }, (v, i) => i);
let deletedStack = [];
for (const index in cmd) {
const [direction, num = 0] = cmd[index].split(" ");
if (direction === "D") {
let temp = 0;
let count = Number(num);
while (count > 0 && current < row.length) {
current = current += 1;
if (row[current]) {
count--;
}
}
continue;
}
if (direction === "U") {
let count = Number(num);
while (count > 0 && current >= 0) {
current = current - 1;
if (row[current]) {
count -= 1;
}
}
continue;
}
if (direction === "C") {
deletedStack.push([current, row[current]]);
delete row[current];
//find next current
let tempCurrent = current;
let isFound = false;
while (tempCurrent < row.length) {
if (row[tempCurrent]) {
isFound = true;
break;
}
tempCurrent += 1;
}
if (isFound) {
current = tempCurrent;
} else {
let temp = current;
//๋ฐ๋๋ก ์์์ ธ์ผ ํจ.
while (temp >= 0) {
if (row[temp]) {
current = temp;
break;
}
temp--;
}
}
continue;
}
if (direction === "Z") {
//current๋ ๋ณ๊ฒฝ x
//restore
const currentValue = row[current];
if (!deletedStack.length) continue;
const [index, value] = deletedStack.pop();
row[index] = value;
continue;
}
}
// compare
for (const num of row) {
if (num === undefined) {
answer += "X";
} else {
answer += "O";
}
}
return answer;
}
์ฑ ์ ์ฐธ๊ณ ํ ๋ฌธ์ ์ ๊ทผ๋ฒ
LinkedList
์๋ฃ๊ตฌ์กฐ์ ๊ฐ๋ ์ ํ์ฉํ ๋ฐฉ๋ฒ์ผ๋ก ์ญ์ ๋ ํ์ด ์๋ค๋ฉด, ์ญ์ ๋ ํ์ ๊ธฐ์ค์ผ๋ก ์, ์๋ ํ ์ ๋ฐ๋ก ์ฐ๊ฒฐ์์ผ ์ค๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ด ์ฝ๋์ ๋ฌธ์ ์ ์ธ ๋ชจ๋ ํ์ ์ํํ ํ์์์ด, ์ญ์ ๋ ํ์ ์ ์ธํ๊ณ ๊ทธ ๋ค์ ํ์ด ์ด๋์ธ์ง๋ฅผ O(1)์ ์ ๊ทผ์ผ๋ก ํจ์จ์ ์ธ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
// ์ ํ๋: 30, ํจ์จ์ฑ: 70
function solution(n, k, cmd) {
var answer = Array(n).fill("O");
let current = k+1;
let deletedStack = [];
let up = Array.from({ length: n+2 }, (v, i) => i-1);
let down = Array.from({length: n+1},(v,i)=>i+1);
for (const index in cmd){
const [direction, num = 0] = cmd[index].split(" ");
if(direction === "C"){
deletedStack.push(current);
up[down[current]] = up[current]
down[up[current]] = down[current]
current = n<down[current] ? up[current] : down[current];
continue;
}
if(direction === "Z"){
const deletedRow = deletedStack.pop();
down[up[deletedRow]] = deletedRow;
up[down[deletedRow]] = deletedRow;
continue
}
if(direction ==="U"){
for(let i =0; i<Number(num); i++){
current = up[current]
}
continue;
}
if(direction === "D"){
for(let i =0; i<Number(num); i++){
current = down[current]
}
continue;
}
}
//์ญ์ ๋ ํ์ deletedStack์์ ์ฐพ๋๋ค.
while(deletedStack.length){
const row = deletedStack.pop()
answer[row-1] = "X"
}
return answer.join("")
}
ํ๊ณ
- ์ญ์ ๋ ํ์ด ์์ ๋ ๋ถํ์ํ ์ฐ์ฐ์ ์์ ๊ณ ๋ค์ ํ์ด ์ด๋์ง๋ฅผ ์๋ฆฌ๋
LinkedList
๋ฅผ ์๊ฐ๋ชปํ ๋ถ๋ถ์ด ์์ฌ์ ์ง๋ง, ์ด๋ฒ ๊ธฐํ์ ์ ๋๋ก ํ์ฉํด ๋ณผ ์ ์์๋ค.