-
[코딩테스트] 프로그래머스 javascript 2단계 - 프렌즈4블록알고리즘/코딩 테스트 2023. 2. 9. 12:29
프렌즈4블록
https://school.programmers.co.kr/learn/courses/30/lessons/17679
문제 설명
블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.
만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다.블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.
만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.
위 초기 배치를 문자로 표시하면 아래와 같다.
TTTANT RRFACC RRRFCC TRRRAA TTMMMF TMMTTJ
각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.
문제풀이
- 4개가 모여있는 것을 찾고, 0으로 초기화 시키고, 다시 재정렬하는 3가지의 과정을 반복한다.
- 1. 찾기
찾기는 쉽다. 4개가 같은 것일 때 founded 배열에 저장한다.
- 2. 부수기
부수기는 4개를 0으로 저장하는 것이다.
- 3. 재정렬
이 과정을 유의깊게 살펴봐야 한다.
if (! board[i].some(v => ! v)) continue;
위 구문으로 하나의 행에 0이 하나도 없다면 즉 if ( board[i].every(v => v)) continue; 모두가 0이 아니라면 for문을 패스한다.
for (let j = 0; j < n; j++) { for (let k = i - 1; k >= 0 && ! board[i][j]; k--) { if (board[k][j]) { board[i][j] = board[k][j]; board[k][j] = 0; console.log('i'+i+'j'+j+'k'+k) break; } } }
for문을 돌면서 board[i][j]가 0이면서 위에 값이 0이 아닌 것을 찾아서 바꿔주고 board[k][j]를 0으로 설정한다.
전체코드는 아래와 같다.
function solution(m, n, board) { board = board.map(v => v.split('')); while (true) { let founded = []; // 찾기 for (let i = 1; i < m; i++) { for (let j = 1; j < n; j++) { if (board[i][j] && board[i][j] === board[i][j - 1] && board[i][j] === board[i - 1][j - 1] && board[i][j] === board[i - 1][j]) { founded.push([i, j]); } } } if (! founded.length) return [].concat(...board).filter(v => ! v).length; // 부수기 founded.forEach(a => { board[a[0]][a[1]] = 0; board[a[0]][a[1] - 1] = 0; board[a[0] - 1][a[1] - 1] = 0; board[a[0] - 1][a[1]] = 0; }); // 재정렬 for (let i = m - 1; i > 0; i--) { if ( board[i].every(v => v)) continue; for (let j = 0; j < n; j++) { for (let k = i - 1; k >= 0 && ! board[i][j]; k--) { if (board[k][j]) { board[i][j] = board[k][j]; board[k][j] = 0; console.log('i'+i+'j'+j+'k'+k) break; } } } } } }
사고력, 구현력이 중요한 문제였다.
코딩..테슽...카카오 문제는 너무나 어려운 것 같다....ㅎ....'알고리즘 > 코딩 테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 javascript 2단계 - 배달 , 다익스트라 (0) 2023.02.09 프로그래머스 javascript 2단계 - 다리를 지나는 트럭 (0) 2023.02.09 [코딩테스트] 프로그래머스 javascript 2단계 - 뉴스 클러스터링 ,연속 부분 수열 합의 개수,피로도,땅따먹기,방문 길이 (0) 2023.02.09 [코딩테스트] 프로그래머스 javascript 2단계 - 튜플,압축 (0) 2023.02.08 [코딩테스트] 프로그래머스 javascript 2단계 - 스킬트리,행렬의 곱셈,n^2 배열 자르기,위장 (0) 2023.02.08