[ํ๋ก๊ทธ๋๋จธ์ค] 1์ฐจ ํ๋ ์ฆ4๋ธ๋ก (js)
https://programmers.co.kr/learn/courses/30/lessons/17679/solution_groups?language=javascript
function popBlock(board){
let count = 0;
for(let i=1; i<board.length; i++){
for(let j=1; j<board[i].length; j++){
const value = board[i][j];
if(value === 0) continue;
const [left, up, diagonal] = [board[i][j-1], board[i-1][j], board[i-1][j-1]];
if((value===up || up===value+String(1)) &&
(value===left || left===value+String(1)) &&
(value===diagonal || diagonal===value+String(1))){
if(up.length < 2){
board[i-1][j] = up+String(1);
}
if(left.length < 2){
board[i][j-1] = left+String(1);
}
if(diagonal.length < 2){
board[i-1][j-1] = diagonal+String(1);
}
if(board[i][j].length < 2){
board[i][j] = value+String(1);
}
count++;
}
}
}
return [board,count];
}
function pullDown(board){ // ํ๊ณผ ์ด ๋ค์ง๊ณ 0 ์์ผ๋ก ๋ก๊ธด ํ ๋ค์ ๋ค์ง์ด์ return
let pullDownArr = [];
let fnResult = [];
for(let i = 0; i < board[1].length; i++){ // mํ n์ด ๋ฐฐ์ด nํ m์ด๋ก ๋ณํ
let arr = [];
for(let j = 0; j < board.length; j++){
arr.push(board[j][i]);
}
arr = arr.map(v => {
if(v.length > 1) return 0;
else return v;
})
let sortArr = [];
for(let idx=0; idx < arr.length; idx++){
if(arr[idx]===0) sortArr.unshift(0);
else sortArr.push(arr[idx]);
} // 0์์ผ๋ก ๋ก๊ธฐ๊ธฐ
pullDownArr.push(sortArr);
}
for(let i = 0; i < pullDownArr[1].length; i++){ // 0์์ผ๋ก ๋ก๊ธด ํ ์๋๋๋ก ๋ณํ
let arr2 = [];
for(let j = 0; j < pullDownArr.length; j++){
arr2.push(pullDownArr[j][i]);
}
fnResult.push(arr2)
}
return fnResult; // ๋ฆฌํด
}
function solution(m, n, board) {
board = board.map(v => v.split(""));
let answer = popBlock(board)[0];
while(true){
answer = popBlock(answer)[0];
answer = pullDown(answer);
if(popBlock(answer)[1] === 0) break;
}
return answer.reduce((prev, cur) => {
let count = 0;
cur.forEach(v => {
if(v===0) count++;
})
return prev+count;
},0);
}
popBlock ํจ์ => 2x2 ๋ธ๋ก์ด pop๋๋ ๊ฑธ ๊ธฐ๋ก (pop๋๋ฉด ํด๋น index๊ฐ์ 1์ ๋ถํ์ ์ ์ฅ) ex) R -> R1
=> 2X2๋ฟ๋ง ์๋๋ผ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ๋ ์ ๊ฑฐํด์ผ ํ๋ฏ๋ก if๋ฌธ ์ฉ์ดํ๊ฒ ์ฌ์ฉํ๊ธฐ์ํจ (R==R1)
=> ํ ์คํธ์ผ์ด์ค 8๋ฒ 10๋ฒ์ด ์๋๋ฉด ๋ณํํด์ฃผ๋ ๋ฌธ์๊ฐ ์๋ชป๋ ๊ฑธ ์๋ ์์
ex) R1์ธ๋ฐ ํด๋น๋์ด ๋ 1์ ๋ํด R11์ด ๋จ => ํจ์ ๋ด if์กฐ๊ฑด์ ์ ๋ง์ pop์ด ์๋จ
=> 1์ ํ๋๋ง ๋ถ์ ์ ์๋๋ก ์กฐ์ ( ex) 15๋ผ์ธ)
ํด๋น ํจ์์์ count๊ฐ 0์ด๋ฉด solutionํจ์์์ while์ break๊ฑธ ์ ์๋๋ก ํจ
=> pop๋๋ 2x2 ๋ธ๋ก์ด ์์ผ๋ฉด ๋๋ด์ผํจ
pullDown ํจ์ => ์ฐ์ฐ์ด ๋๋ ํ pop๋ ๋ถ์์ ์์ ์๋ ๊ฐ๋ค์ ๋ด๋ฆฌ๋ ํจ์
๋ฌธ์ ๋ค์ 1์ด ๋ถ์ ๊ฐ์ 0์ผ๋ก ๋ฐ๊พผ ํ ํ๋ ฌ์ ๋ค์ง๊ณ 0์ ์์ผ๋ก ๋ก๊ธด ํ ๋ค์ ํ๋ ฌ์ ๋ค์ง๊ณ return
=> ex) [ [A, B, C], [A, A1, C] ] => [ [A, A], [B, A1], [C, C] ] => [ [A, A], [0, B], [C, C] ] => [ [A, 0, C], [A, B, C] ]
๊ฒฐ๊ณผ ํ๋ ฌ(3x2) 2x3์ผ๋ก ๋ค์ง์ ๋ฌธ์๋ค์ 1์๋ ๊ฐ ๋ค์ 3x2๋ก๋ง๋ค๊ณ ๋ฆฌํด
=>0์ผ๋ก ๋ณํ ํ ๋งจ ์์ผ๋ก ๋ก๊น
solution ํจ์์์ while๋ฌธ์ ํตํด ๋ฃจํ๋ฅผ ๋ ํ ๊ฒฐ๊ณผ ํ๋ ฌ์ ๋ํด 0์ ๊ฐ์(pop๋ ๊ฐ์)๋ฅผ ์ผ ํ returnํ๋ฉด ์ ๋ต!
๋ค์์ ํ๋์ ํจ์๋ ํ๋์ ๊ธฐ๋ฅ์ ํ๋๋ก ๋ ๋๋ ์ ํ์ด๋ด์ผ๊ฒ ๋ค.