Post

[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.
3D GIF

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?