[2018 KAKAO BLIND RECRUITMENT] [1차] 프렌즈4블록
[2018 KAKAO BLIND RECRUITMENT] [1차] 프렌즈4블록
🙋♂️ 들어가며
이번 문제는 블록을 아래로 떨어뜨리는 부분인 수직낙하 구현이 쉽지 않았다.
✅ 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class Solution {
public int solution(int m, int n, String[] board) {
int to_remove = 0;
int row = m;
int col = n;
// 1. 배열 채우기
char[][] arr = new char[row][col];
for (int r = 0; r < row; r++) {
arr[r] = board[r].toCharArray();
}
// 2. 탐색
while (true) {
boolean[][] visited = new boolean[row][col];
boolean can_delete_block = false;
for (int r = 0; r < row-1; r++) {
for (int c = 0; c < col-1; c++) {
char ch = arr[r][c];
// 2-1. 빈공간이면 skip
if (ch == '.') continue;
// 2-2. 4개 같으면 true
char right = arr[r][c+1];
char diag = arr[r+1][c+1];
char down = arr[r+1][c];
if (ch == right && right == diag && diag == down) {
visited[r][c] = true;
visited[r][c+1] = true;
visited[r+1][c+1] = true;
visited[r+1][c] = true;
can_delete_block = true;
}
}
}
// 2-3. 블록 못지우면 조기종료 (최적화)
if (!can_delete_block) break;
// 2-4. 지울 블록 빈공간 처리
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (visited[r][c]) {
arr[r][c] = '.';
to_remove++;
}
}
}
// 3. 블록 아래로 떨어뜨리기 (수직낙하)
// stack 처럼 채우기
for (int c = 0; c < col; c++) {
int er = row-1;
for (int r = row-1; r >= 0; r--) {
if (arr[r][c] != '.') {
char temp = arr[r][c];
arr[r][c] = '.';
arr[er][c] = temp;
er--;
}
}
}
}
return to_remove;
}
}
This post is licensed under CC BY 4.0 by the author.

