๐ฉ๐ปโ๐ป๋ฌธ์ ๋งํฌ
[ํ๋ก๊ทธ๋๋จธ์ค 64061] ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ฒ์ (Javascript)
๋ฌธ์ ์ค๋ช
๊ฒ์๊ฐ๋ฐ์์ธ "์ฃ ๋ฅด๋"๋ ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ธฐ๊ณ๋ฅผ ๋ชจ๋ฐ์ผ ๊ฒ์์ผ๋ก ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค.
"์ฃ ๋ฅด๋"๋ ๊ฒ์์ ์ฌ๋ฏธ๋ฅผ ๋์ด๊ธฐ ์ํด ํ๋ฉด ๊ตฌ์ฑ๊ณผ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ด ๊ฒ์ ๋ก์ง์ ๋ฐ์ํ๋ ค๊ณ ํฉ๋๋ค.
๊ฒ์ ํ๋ฉด์ "1 x 1" ํฌ๊ธฐ์ ์นธ๋ค๋ก ์ด๋ฃจ์ด์ง "N x N" ํฌ๊ธฐ์ ์ ์ฌ๊ฐ ๊ฒฉ์์ด๋ฉฐ ์์ชฝ์๋ ํฌ๋ ์ธ์ด ์๊ณ ์ค๋ฅธ์ชฝ์๋ ๋ฐ๊ตฌ๋๊ฐ ์์ต๋๋ค. (์ ๊ทธ๋ฆผ์ "5 x 5" ํฌ๊ธฐ์ ์์์ ๋๋ค). ๊ฐ ๊ฒฉ์ ์นธ์๋ ๋ค์ํ ์ธํ์ด ๋ค์ด ์์ผ๋ฉฐ ์ธํ์ด ์๋ ์นธ์ ๋น์นธ์ ๋๋ค. ๋ชจ๋ ์ธํ์ "1 x 1" ํฌ๊ธฐ์ ๊ฒฉ์ ํ ์นธ์ ์ฐจ์งํ๋ฉฐ ๊ฒฉ์์ ๊ฐ์ฅ ์๋ ์นธ๋ถํฐ ์ฐจ๊ณก์ฐจ๊ณก ์์ฌ ์์ต๋๋ค. ๊ฒ์ ์ฌ์ฉ์๋ ํฌ๋ ์ธ์ ์ข์ฐ๋ก ์์ง์ฌ์ ๋ฉ์ถ ์์น์์ ๊ฐ์ฅ ์์ ์๋ ์ธํ์ ์ง์ด ์ฌ๋ฆด ์ ์์ต๋๋ค. ์ง์ด ์ฌ๋ฆฐ ์ธํ์ ๋ฐ๊ตฌ๋์ ์์ด๊ฒ ๋๋ ๋ฐ, ์ด๋ ๋ฐ๊ตฌ๋์ ๊ฐ์ฅ ์๋ ์นธ๋ถํฐ ์ธํ์ด ์์๋๋ก ์์ด๊ฒ ๋ฉ๋๋ค. ๋ค์ ๊ทธ๋ฆผ์ [1๋ฒ, 5๋ฒ, 3๋ฒ] ์์น์์ ์์๋๋ก ์ธํ์ ์ง์ด ์ฌ๋ ค ๋ฐ๊ตฌ๋์ ๋ด์ ๋ชจ์ต์ ๋๋ค.
๋ง์ฝ ๊ฐ์ ๋ชจ์์ ์ธํ ๋ ๊ฐ๊ฐ ๋ฐ๊ตฌ๋์ ์ฐ์ํด์ ์์ด๊ฒ ๋๋ฉด ๋ ์ธํ์ ํฐ๋จ๋ ค์ง๋ฉด์ ๋ฐ๊ตฌ๋์์ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค. ์ ์ํ์์ ์ด์ด์ [5๋ฒ] ์์น์์ ์ธํ์ ์ง์ด ๋ฐ๊ตฌ๋์ ์์ผ๋ฉด ๊ฐ์ ๋ชจ์ ์ธํ ๋ ๊ฐ๊ฐ ์์ด์ง๋๋ค.
ํฌ๋ ์ธ ์๋ ์ ์ธํ์ด ์ง์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ ๋ง์ฝ ์ธํ์ด ์๋ ๊ณณ์์ ํฌ๋ ์ธ์ ์๋์ํค๋ ๊ฒฝ์ฐ์๋ ์๋ฌด๋ฐ ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ํ ๋ฐ๊ตฌ๋๋ ๋ชจ๋ ์ธํ์ด ๋ค์ด๊ฐ ์ ์์ ๋งํผ ์ถฉ๋ถํ ํฌ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. (๊ทธ๋ฆผ์์๋ ํ๋ฉดํ์ ์ ์ฝ์ผ๋ก 5์นธ๋ง์ผ๋ก ํํํ์์)
๊ฒ์ ํ๋ฉด์ ๊ฒฉ์์ ์ํ๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด board์ ์ธํ์ ์ง๊ธฐ ์ํด ํฌ๋ ์ธ์ ์๋์ํจ ์์น๊ฐ ๋ด๊ธด ๋ฐฐ์ด moves๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ํฌ๋ ์ธ์ ๋ชจ๋ ์๋์ํจ ํ ํฐํธ๋ ค์ ธ ์ฌ๋ผ์ง ์ธํ์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
[์ ํ์ฌํญ]
board ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ํฌ๊ธฐ๋ "5 x 5" ์ด์ "30 x 30" ์ดํ์
๋๋ค.
board์ ๊ฐ ์นธ์๋ 0 ์ด์ 100 ์ดํ์ธ ์ ์๊ฐ ๋ด๊ฒจ์์ต๋๋ค.
0์ ๋น ์นธ์ ๋ํ๋
๋๋ค.
1 ~ 100์ ๊ฐ ์ซ์๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธํ์ ๋ชจ์์ ์๋ฏธํ๋ฉฐ ๊ฐ์ ์ซ์๋ ๊ฐ์ ๋ชจ์์ ์ธํ์ ๋ํ๋
๋๋ค.
moves ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 1 ์ด์ 1,000 ์ดํ์
๋๋ค.
moves ๋ฐฐ์ด ๊ฐ ์์๋ค์ ๊ฐ์ 1 ์ด์์ด๋ฉฐ board ๋ฐฐ์ด์ ๊ฐ๋ก ํฌ๊ธฐ ์ดํ์ธ ์์ฐ์์
๋๋ค.
์
์ถ๋ ฅ ์
board moves result
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4
์
์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
์
์ถ๋ ฅ ์ #1
์ธํ์ ์ฒ์ ์ํ๋ ๋ฌธ์ ์ ์ฃผ์ด์ง ์์์ ๊ฐ์ต๋๋ค. ํฌ๋ ์ธ์ด [1, 5, 3, 5, 1, 2, 1, 4] ๋ฒ ์์น์์ ์ฐจ๋ก๋๋ก ์ธํ์ ์ง์ด์ ๋ฐ๊ตฌ๋์ ์ฎ๊ฒจ ๋ด์ ํ, ์ํ๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ผ๋ฉฐ ๋ฐ๊ตฌ๋์ ๋ด๋ ๊ณผ์ ์์ ํฐํธ๋ ค์ ธ ์ฌ๋ผ์ง ์ธํ์ 4๊ฐ ์ ๋๋ค.
โ๏ธIdea Sketch
2021-06-26
1. ๊ฐ์ ์ธํ์ด ์คํ์ ์์ด๋ฉด ํฐ์ง --> cnt++
- 4, 3, 1, 1, 3, 2, 4 ์์ผ๋ก ์์ด๊ณ , 1์ด ๋จผ์ ํฐ์ง ํ 3์ด ํฐ์ง
- ์ด 4๊ฐ์ ์ธํ์ด ํฐ์ง
2. moves๋งํผ ๋ฐ๋ณต๋ฌธ ์คํ
- moves๋ฅผ ์ธ๋ฑ์ค ๋ฐฐ์ด๋ก ์ฌ์ฉํ๊ธฐ ์ํด x = x-1 ์ถ๊ฐ
for (let x of moves) {
x = x-1;
}
3. board ๊ฐ์ด ์กด์ฌํ ๋๊น์ง ์ํ
- board[i][x] === 0 ์ด๋ฉด i++;
- board[i][x] !== 0 ์ด๋ฉด stack.push( board[i][x] );, 0์ด ๋จ
for (let i=0; i<board.length; i++) {
if (board[i][x]) {
stack.push(board[i][x]);
board[i][x] = 0;
}
}
์ฃผ์
board[i][x] ๊ฐ์ด ์กด์ฌํ๋ฉด ์ํ ์ค์ง!!
break;
4. stack ๊ตฌํ 1
- ๊ฐ์ ์ธํ์ด ์์ด๋ฉด ํญ๋ฐ, cnt + 2
- stack.push( board[i][x] ); ํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ํ์ธํ๋ฉด ๋ ์ข์ ๋ฏ?
- board ๊ฐ์ด stack์ ๋ง์ง๋ง ๊ฐ๊ณผ ๋์ผํ ๊ฒฝ์ฐ, stack.pop(), cnt + 2
for (let i=0; i<board.length; i++) {
if (board[i][x] === stack[stack.length-1]) {
stack.pop();
board[i][x] = 0;
cnt += 2;
}
else if (board[i][x]) {
stack.push(board[i][x]);
board[i][x] = 0;
}
}
5. stack ๊ตฌํ 2
- board[i][x] ๊ฐ์ด ์กด์ฌํ๋ฉด ๋ฌด์กฐ๊ฑด stack.push()
- stack[stack.length-1]๊ณผ [stack[stack.length-2]๊ฐ ๋์ผํ์ง ํ์ธ
โ๏ธ์์ค์ฝ๋
2021-06-26 ์ ํ์ฑ ํต๊ณผ, ํ ์ผ 4๋ฒ 4.45ms, 33.1MB
- ์คํ์ ๋ฃ๊ธฐ ์ , board ๊ฐ๊ณผ stack ์ ๋ง์ง๋ง ๊ฐ์ด ์ผ์นํ๋์ง ํ์ธ
function solution(board, moves) {
let cnt = 0;
let stack = [];
for (let x of moves) {
x = x - 1;
for (let i = 0; i < board.length; i++) {
if (board[i][x] === stack[stack.length - 1]) {
stack.pop();
board[i][x] = 0;
cnt += 2;
break;
}
else if (board[i][x]) {
stack.push(board[i][x]);
board[i][x] = 0;
break;
}
}
}
return cnt;
}
2021-06-26 ์ ํ์ฑ ํต๊ณผ, ํ ์ผ 4๋ฒ 0.95ms, 30.1MB
- board ๊ฐ์ด 0์ด ์๋๋ฉด ๋ฌด์กฐ๊ฑด stack์ push
- push ํ ํ ๋ ์ธํ์ ์ผ์น์ฌ๋ถ ํ๋ณ
function solution(board, moves) {
let cnt = 0;
let stack = [];
for (let x of moves) {
x = x - 1;
for (let i = 0; i < board.length; i++) {
if (board[i][x]) {
stack.push(board[i][x]);
board[i][x] = 0;
let len = stack.length;
if (stack[len-1] === stack[len-2]) {
stack.pop();
stack.pop();
cnt += 2;
}
break;
}
}
}
return cnt;
}
โ๏ธ๋ช ๋ต
const transpose = matrix =>
matrix.reduce(
(result, row) => row.map((_, i) => [...(result[i] || []), row[i]]),
[]
);
const solution = (board, moves) => {
const stacks = transpose(board).map(row =>
row.reverse().filter(el => el !== 0)
);
const basket = [];
let result = 0;
for (const move of moves) {
const pop = stacks[move - 1].pop();
if (!pop) continue;
if (pop === basket[basket.length - 1]) {
basket.pop();
result += 2;
continue;
}
basket.push(pop);
}
return result;
};
๋๊ธ ์ธ์ฉ
๋ค์ ์ฝ์ด๋ณด๊ธฐ
์์๋ฅผ ๋ค์ด, let A = transpose([[1, 2, 3], [4, 5, 6]]) ๋ผ๊ณ ํด๋ณด์ฃ . transpose์์ ๊ฐ ์์๋ฅผ ๋ถ์ํ๋ ํจ์๊ฐ ๋ ๊ฐ ์์ต๋๋ค. reduce์ map์ ๋๋ค. reduce๋ [1,2,3]๊ณผ [4,5,6]์ด ์์๊ฐ ๋ ๊ฒ์ด๋ฉฐ, map์ reduce๊ฐ [1,2,3]์ผ ๋ 1๊ณผ 2์ 3์ด ๋๋ฉฐ, [4,5,6]์ผ ๋๋ 4,5,6์ด ๋ฉ๋๋ค. ์ด ๋ map์ ๊ฐ ์์์ โํ์ดํ ํจ์์ ๋ฐํ๊ฐโ์ผ๋ก ๋์ฒดํด์ค๋ค๊ณ ํ์ฃ ? ๊ทธ๋ ๋ค๋ฉด map((_, i) => [(result[i] || []), row[i]])์์ reduce = [1,2,3]์ผ ๋ 1 ์ map = [โฆ(result[0]||[]),row[0])์ด ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ result[0]์ [][0]์ ๊ฐ๊ณ ์ด ๊ฐ์ null์ ๋๋ค. [โฆ(null||[]),row[0])๊ณผ ๋๊ฐ๊ธฐ์ ์ด ๊ฒฐ๊ณผ๋ [โฆ[],1]์ด ๋ฉ๋๋ค. (์ฌ๊ธฐ์ A||B๋ A์ ๊ฐ์ด null์ด๋ undefined๊ฐ ๋ผ๋ฉด B๋ฅผ ๋ฐํํ๊ณ , ์๋๋ผ๋ฉด A๋ฅผ ๋ฐํํฉ๋๋ค.) ๊ฐ์ ๋ฐฉ์์ผ๋ก 2์ 3์ [โฆ[],2],[โฆ[],3]์ด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก reduce = [1,2,3]์ผ ๋ map์ ํตํด์ ๋ฐํ๋๋ ๊ฒ์ [[โฆ[],1],[โฆ[],2],[โฆ[],3]]์ด ๋๋ฉฐ, โฆ๋ฌธ๋ฒ์ ๋น๋ฐฐ์ด์ ๋ฌด์ํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ [[1],[2],[3]]์ด ๋ฉ๋๋ค.
๋ค์ reduce๊ฐ [4,5,6]์ผ ๋์ result์๋ โ์ด์ ์ธ๋ฑ์ค์ ๋ฐํ๊ฐโ์ธ [[1],[2],[3]]๊ฐ ์ ์ฅ๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก reduce๊ฐ [4,5,6]์ผ ๋์๋ 4์์ [โฆ(result[0],[]),row[0])์ธ๋ฐ ์ด ๊ฐ์, [โฆ([1]||[]),row[0])๊ณผ ๊ฐ๊ณ ์ด๋ [โฆ[1],4]์ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ! โฆ๋ฌธ๋ฒ์์๋ ๋ฐฐ์ด ์์ ์์๋ฅผ ๋์ง์ด ๋ด์ฃผ๊ธฐ ๋๋ฌธ์, ์ด๋ [1,4]์ ๊ฐ์ต๋๋ค. ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ดํ์๋ [2,5],[3,6]์ด ๋์ต๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก A์๋ [[1,2,3],[4,5,6]]์ ํจ์๋ฅผ ํตํด ๋ณํํด์ค [[1,4],[2,5],[3,6]]์ด ์ ์ฅ๋๋ ๊ฒ์ ๋๋ค. ๋ฌธ์ ์์๋ transpose([[0, 0, 0, 0, 0], [0, 0, 1, 0, 3], [0, 2, 5, 0, 1], [4, 2, 4, 4, 2], [3, 5, 1, 3, 1]])์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ๊ทธ๋ ๋ค๋ฉด, [[0, 0, 0, 4, 3],[0, 0, 2, 2, 5],[0, 1, 5, 4, 1],[0, 0, 0, 4, 3],[0, 3, 1, 2, 1]]์ด ๋ฉ๋๋ค. ์ด๋ 5X5๋ฐฐ์ด์ ํ๊ณผ ์ด์ ๋ฐ๊พธ์ด์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์ง์