2022. 9. 3. 21:21ㆍAlgorithm/프로그래머스
level : 2
문제 링크 : [1차] 프렌즈4블록
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
My Solution
function solution(m, n, board) {
let answer = 0;
board = board.map(arr=>arr.split(''));
while(true){
const temp = IsBlock(m,n,board);
if(temp.length===0)
break;
temp.forEach((arr)=>{
board[arr[0]][arr[1]]=0;
board[arr[0]+1][arr[1]]=0;
board[arr[0]][arr[1]+1]=0;
board[arr[0]+1][arr[1]+1]=0;
})
move(m,n,board);
}
board.forEach((arr=>{arr.forEach(value=>{if(value===0) answer++;})}))
return answer;
}
function IsBlock(m,n,board){
let block = [];
for(let i = 0; i < m-1; i++){
for(let j = 0 ; j < n-1; j++){
const temp = board[i][j];
if(temp!==0&&board[i+1][j]===temp&&board[i][j+1]===temp&&board[i+1][j+1]===temp)
block.push([i,j]);
}
}
return block;
}
function move(m,n,board){
for(let j = 0; j < n;j++){
let temp = [];
for(let i = 0 ; i < m; i++)
if(board[i][j]!==0)
temp.push(board[i][j]);
while(temp.length!==m)
temp.unshift(0);
for(let i = 0 ; i < m; i++)
board[i][j] = temp[i];
}
}
풀이방법
문제 해결을 위하여 추가적으로 두 개의 함수를 더 작성하였다. (solution함수 아래에 작성하였지만 hoisting으로 인하여 함수 호출에는 문제가 없었다.)
IsBlock함수
=> 같은 모양의 카카오프렌즈 블록이 2×2 형태로 있을 경우 좌측 상단의 좌표들을 2D Array 형태로 반환하는 함수이다.
move함수
=> 블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 하는 함수이다.
우선적으로 board라는 1차원 Array를 2차원 Array로 변환을 해주었다.
그리고 반복문을 작성하였다.
IsBlock함수를 이용하여 지울 수 있는 블록들을 찾아 temp라는 변수에 초기화 해준다.
만약 temp의 길이가 0이면 반복문을 탈출한다.
탈출하지 못하였다면 temp의 좌표들을 기준으로 2 x 2의 블록들을 모두 비워준다. (비우는 표시는 0으로 선언하는 것이다.)
move라는 함수를 이용하여 블록들을 떨어뜨려 빈 공간을 채운다.
위의 행위를 반복한다.
탈출을 하였다면 board라는 2차원 Array에서 비워져있는 블록이 있을 때마다 answer을 1씩 증가시킨다.
마지막으로 solution함수는 answer를 반환한다.
느낀점
최대한 로직별로 함수를 만들려고 노력했다.
중간에 IsBlock이라는 함수에서 if문에서 temp가 비어있는 지 체크를 하지 않아 무한루프에 빠졌다. 하지만 어디서 잘못 되었는지 몰라 헤맸다.
그리고 다 풀고 시간복잡도를 계산하려고 하였으나 2차원 배열을 완전 탐색해야하기 때문에 O(N^2)보다 작아질 수는 없었다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[JavaScript] 후보키 (0) | 2022.09.06 |
---|---|
[JavaScript] 소수 찾기 (0) | 2022.09.06 |
[JavaScript] 네트워크 (0) | 2022.09.01 |
[JavaScript] 위장 (0) | 2022.08.31 |
[JavaScript] 두 큐 합 같게 만들기 (0) | 2022.08.23 |