반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/17679
문제 풀이 힌트
그래프를 얼마나 잘 ~ 아는지 확인하는 문제였다.
- 주어진 board를 2차원 배열로 변경
- 2*2 가 다 똑같은 블록인지 체크하기
- 2*2 인 블록은 0으로 채우기
- 위에 문자가 있는 블록이고, 아래 빈 블록이면 문자 블록을 내려주기 .
문제 풀이 코드
function solution(m, n, board) {
board = board.map(v => v.split('')); // 문자열 배열을 2차원 배열로 변환
while (true) {
let arr = []; // 제거할 블록의 좌표를 저장할 배열
for (let i = 0; i < m - 1; i++) {
for (let j = 0; j < n - 1; j++) {
// 빈칸이 아니고, 2x2 블록이 모두 동일한 문자일 경우 해당 블록의 좌표를 저장
if (board[i][j] &&
board[i][j] === board[i][j + 1] &&
board[i][j] === board[i + 1][j] &&
board[i][j] === board[i + 1][j + 1]) {
arr.push([i, j]);
}
}
}
// 제거할 블록이 없으면 남은 블록 중 빈칸(0)의 개수를 반환
if (!arr.length) return [].concat(...board).filter(v => !v).length;
// 2x2 블록을 0으로 설정하여 제거
for (let i = 0; i < arr.length; i++) {
let col = arr[i][0];
let row = arr[i][1];
board[col][row] = 0;
board[col][row + 1] = 0;
board[col + 1][row] = 0;
board[col + 1][row + 1] = 0;
}
// 블록을 아래로 떨어뜨리기
for (let i = m - 1; i >= 0; i--) { // 아래에서부터 행을 순회
for (let j = 0; j < n; j++) { // 열을 순회
if (board[i][j] === 0) { // 현재 칸이 빈칸인 경우
for (let k = i - 1; k >= 0; k--) { // 위쪽 행을 탐색
if (board[k][j] !== 0) { // 블록이 있으면
board[i][j] = board[k][j]; // 현재 행으로 블록을 떨어뜨림
board[k][j] = 0; // 원래 있던 위치를 0으로 설정
break; // 다음 열로 이동
}
}
}
}
}
}
}
Only 의사 코드
function solution(m, n, board) {
board = board.map(v => v.split(''));
while(true){
let arr = [];
for(let i=0; i<m-1; i++){
for(let j=0; j<n-1; j++){
if(board[i][j] &&
board[i][j] === board[i][j+1] &&
board[i][j] === board[i+1][j] &&
board[i][j] === board[i+1][j+1]
){
arr.push([i, j])
}
}
}
if(!arr.length) return [].concat(...board).filter(v => !v).length;
for(let i=0; i<arr.length; i++){
let col = arr[i][0];
let row = arr[i][1];
board[col][row] = 0
board[col][row+1] = 0
board[col+1][row] = 0
board[col+1][row+1] = 0
}
for(let i=m-1; i>=0; i--){
for(let j=0; j<n; j++){
if(board[i][j] === 0){
for(let k=i-1; k>=0; k--){
if(board[k][j] !== 0){
board[i][j] = board[k][j];
board[k][j] = 0;
break;
}
}
}
}
}
}
}
알고가는 ppoint
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: [3차]방금그곡 - javascript(빡구현) (0) | 2024.04.16 |
---|---|
프로그래머스: 메뉴 리뉴얼- javascript(재귀 이용한 조합, 객체) (0) | 2024.04.14 |
프로그래머스: [3차]파일명 정렬 - javascript(정규식 끝판왕) (0) | 2024.04.11 |
프로그래머스: 오픈채팅방 - javascript(replace, Map, switch) (0) | 2024.04.09 |
프로그래머스: [3차] N진수 게임 - javascript(toString, toUpperCase()) (0) | 2024.04.08 |