Algorithm/Programmers
[JavaScript] ํ๋ก๊ทธ๋๋จธ์ค - ๋ธ๋ก๊ฒ์
๊ฐ๋ฐ๊ฐ๊ตด๐ธ
2022. 9. 16. 20:49
[๋ฌธ์ ]
https://school.programmers.co.kr/learn/courses/30/lessons/42894
[ํ์ด]
์ด๊ธฐ ์ธํ
1. ๊ฐ ๋ธ๋ก์ผ๋ก ๋ง๋ค ์ ์๋ ์ง์ฌ๊ฐํ์ ์ขํ์ ๋ธ๋ก๋ฒํธ๋ฅผ ์ ์ฅํฉ๋๋ค.
- block ๋ฐฐ์ด์ [๋ธ๋ก๋ฒํธ, x1, y1, x2, y2]ํํ๋ก ์ ์ฅํฉ๋๋ค. ์ด๋ ํด๋น ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(x1, y1) | (x1, y2) | |
(x2, y1) | (x2, y2) |
- block ๋ฐฐ์ด์ ์ด๋ index์ ๋ธ๋ก๋ฒํธ๊ฐ ์ ์ฅ๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด Map์ ํ์ฉํด (key = ๋ธ๋ก๋ฒํธ, value = ํด๋น ๋ธ๋ก๋ฒํธ์ ์ ๋ณด๊ฐ ๋ด๊ธด block์ index) ํํ๋ก ์ ์ฅํฉ๋๋ค.
2. 1X1ํํ์ ๊ฒ์ ๋ธ๋ก์ ์ฑ์์ฃผ๋ dropBlock ํจ์๋ฅผ ์ ์ธํฉ๋๋ค.
- board๋ฅผ ํ์ํ๋ฉฐ ๊ฒ์ ๋ธ๋ก์ด ๋ค์ด๊ฐ ์ ์๋ ์์น์ -1์ ๋ฃ๋ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
- ์ด๋, ๊ฐ ์ด๋ง๋ค 0~board.length-1๊น์ง ๋ธ๋ก์ด ์๋ ๊ณณ๊น์ง ์๋์ ๊ฐ์ด ๊ฐฑ์ ํฉ๋๋ค.
ํ์ด ๊ณผ์
1. removeBlock ํจ์๋ฅผ ํตํด ์ญ์ ํ ์ ์๋ ๋ธ๋ก์ ์ง์๋๋ค.
- ์ฐ์ , dropBlock ํจ์๋ฅผ ํธ์ถํ์ฌ 1X1ํํ์ ๊ฒ์ ๋ธ๋ก์ ์ฑ์๋๋ค.
- map์ ํ์ํ๋ฉฐ value(๋ธ๋ก ์ ๋ณด์ index) ๋ฅผ ํตํด block ๋ฐฐ์ด์์ [idx, x1, y1, x2, y2] ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
- ๋ธ๋ก ์ ๋ณด๋ก ๋ง๋ค ์ ์๋ ์ง์ฌ๊ฐํ์ 0์ด๋ ๋ค๋ฅธ ๋ธ๋ก๋ฒํธ๊ฐ ์๋ค๋ฉด ์ง์ธ ์ ์์ผ๋ก ๊ฑด๋๋๋๋ค.
- ์ง์ธ ์ ์๋ ๋ธ๋ก์ด๋ผ๋ฉด isChange, answer, block์ ๊ฐฑ์ ํ๊ณ map์์ delete์ฐ์ฐ์ ํตํด ๋ธ๋ก๋ฒํธ๋ฅผ ์ง์๋๋ค. (๋ธ๋ก์ด ์๋ ์์น์ board๊ฐ์ 0์ผ๋ก ๊ฐฑ์ )
- isChange๊ฐ true๋ผ๋ฉด board๊ฐ ๊ฐฑ์ ๋์๊ธฐ ๋๋ฌธ์ removeBlock ํจ์๋ฅผ ์ฌ๊ทํธ์ถ ํฉ๋๋ค.
๋ฐ๋ผ์ removeBlock ํจ์์ ์ฌ๊ทํธ์ถ์ด ๋๋๋ฉด answer์ ์ง์์ง ๋ธ๋ก์ ๊ฐ์๊ฐ ์ ์ฅ๋ฉ๋๋ค.
[์ฝ๋]
function solution(board) {
var answer = 0;
// [idx, x1, y1, x2, y2];
const block = [];
const map = new Map();
for(let i=0;i<board.length;i++) {
for(let j=0;j<board.length;j++) {
if(board[i][j] > 0 && !map.has(board[i][j])) {
let x1, y1, x2, y2;
let idx = board[i][j];
x1 = i;
x2 = i;
y1 = Infinity;
y2 = -Infinity;
for(let k=i;k<board.length;k++) {
if(!board[k].includes(idx)) {
break;
}
x2 = k;
y1 = Math.min(y1, board[k].indexOf(idx));
y2 = Math.max(y2, board[k].lastIndexOf(idx));
}
map.set(idx, block.length);
block.push([idx, x1, y1, x2, y2]);
}
}
}
const dropBlock = () => {
for(let i=0;i<board.length;i++) {
for(let j=0;j<board.length;j++) {
if(board[j][i] > 0) {
break;
}
board[j][i] = -1;
}
}
}
const removeBlock = () => {
let isChange = false;
if(map.size === 0) {
return;
}
dropBlock();
map.forEach((value, key) => {
const [idx, x1, y1, x2, y2] = block[value];
let rm = true;
for(let i=x1;i<=x2;i++) {
for(let j=y1;j<=y2;j++) {
if(board[i][j] !== idx && board[i][j] >= 0) {
rm = false;
break;
}
}
}
// ์ง์ธ ์ ์๋ ๋ธ๋ก์
if(rm) {
isChange = true;
for(let i=x1;i<=x2;i++) {
for(let j=y1;j<=y2;j++) {
board[i][j] = 0;
}
}
map.delete(idx);
answer++;
}
})
if(isChange) {
removeBlock();
}
}
removeBlock();
return answer;
}