🔗 문제 링크
[프로그래머스] 프렌즈4블록 / 2018 KAKAO BLIND RECRUITMENT(1차)
📝 풀이 과정
입력은 String 배열로 들어왔지만 코드의 편의성을 위해 char
형의 이중 배열로 변경하였다
블록을 좌상단부터 시작해 탐색하며 좌우, 좌하, 우하의 칸이 모두 자신의 칸과 동일하면 제거하기 위한 nextBlock
에 .
으로 값을 변경하여 찍어주었다.
이후, 모두 제거가 된 블럭들로 생긴 빈칸을 채우기 위해 반복문을 통해 탐색하였다. 각 보드를 열을 기준으로 한줄씩 살펴보며 최하단부터 칸이 '.'일 때까지 위로 탐색하며 올라갔다. 만약 빈칸이 등장하면 해당칸에서 반복을 멈추었다.
이후, 다음 칸부터 빈칸이 아닌 블록으로 채워진 칸인지 다시 위로 올라가며 탐색하고 만약 블럭칸을 만나면 빈칸과 블럭칸을 교환해주는 방식으로 블록을 내려주었다.
💻 코드
class Solution {
public int solution(int m, int n, String[] board) {
char[][] blocks = new char[m][];
for (int i = 0; i < m; i++)
blocks[i] = board[i].toCharArray();
int answer = 0;
while (true) {
char[][] nextBlocks = new char[m][];
for (int i = 0; i < m; i++)
nextBlocks[i] = blocks[i].clone();
boolean ck = false;
for (int i = 0; i < m - 1; i++) {
for (int j = 0; j < n - 1; j++) {
if (blocks[i][j] == '.')
continue;
if (blocks[i][j] == blocks[i + 1][j]
&& blocks[i][j] == blocks[i][j + 1]
&& blocks[i][j] == blocks[i + 1][j + 1]) {
nextBlocks[i][j] = nextBlocks[i + 1][j] = nextBlocks[i][j + 1] = nextBlocks[i + 1][j + 1] = '.';
ck = true;
}
}
}
if (!ck)
break;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (blocks[i][j] != nextBlocks[i][j])
answer++;
for (int i = 0; i < n; i++) {
int blank = m - 1;
while (true) {
while (blank >= 0 && nextBlocks[blank][i] != '.')
blank--;
int block = blank;
while (block >= 0 && nextBlocks[block][i] == '.')
block--;
if (block < 0)
break;
nextBlocks[blank][i] = nextBlocks[block][i];
nextBlocks[block][i] = '.';
}
}
blocks = nextBlocks;
}
return answer;
}
}
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 방금그곡 / 2018 KAKAO BLIND RECRUITMENT(3차) - JAVA (0) | 2021.01.14 |
---|---|
[프로그래머스] 캐시 / 2018 KAKAO BLIND RECRUITMENT(1차) - JAVA (0) | 2021.01.14 |
[프로그래머스] 뉴스 클러스터링 / 2018 KAKAO BLIND RECRUITMENT(1차) - JAVA (0) | 2021.01.11 |
[프로그래머스] 기능개발 - JAVA (0) | 2021.01.03 |
[프로그래머스] 다리를 지나는 트럭 - JAVA (1) | 2021.01.03 |