본문 바로가기

Programmers/Level3

자물쇠와 열쇠

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
75
76
77
class Solution {
    private static int n, m, zeroCnt = 0;
 
    public static int[][] Rotate(int[][] key) {
        int n = key.length;
        // 상하 반전
        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < n; j++) {
                int temp = key[i][j];
                key[i][j] = key[n - i - 1][j];
                key[n - i - 1][j] = temp;
 
            }
        }
 
        // 대각선 반전
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                int temp = key[i][j];
                key[i][j] = key[j][i];
                key[j][i] = temp;
            }
        }
        return key;
    }
    
    public static boolean keyCheck(int[][] map, int[][] key) {
        for (int i = 0; i <= map.length - m; i++) {
            loop: for (int j = 0; j <= map.length - m; j++) {
                int cnt = 0;
                for (int x = 0; x < m; x++) {
                    for (int y = 0; y < m; y++) {
                        // 돌기가 겹칠 때
                        if (map[i + x][j + y] == 1 && key[x][y] == 1)
                            continue loop;
                        // 홈을 매울 때
                        else if (map[i + x][j + y] == 0 && key[x][y] == 1) {
                            // 기존 lock 범위 내일 때
                            if (i + x >= m - 1 && i + x < n + m - 1 && j + y >= m - 1 && j + y < n + m - 1)
                                cnt++;
                        }
                    }
                }
                // 모든 0을 제거했을 때
                if (cnt == zeroCnt) {
                    return true;
                }
            }
        }
        return false;
    }
    
    public boolean solution(int[][] key, int[][] lock) {
        boolean answer = false;
        n = lock.length;
        m = key.length;
        int[][] newLock = new int[n + 2 * (m - 1)][n + 2 * (m - 1)];
 
        // lock 확장 및 홈의 개수 카운트
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                newLock[m - 1 + i][m - 1 + j] = lock[i][j];
                if (lock[i][j] == 0)
                    zeroCnt++;
            }
        }
 
        for (int k = 0; k < 4; k++) {
            // key 회전
            key = Rotate(key);
            answer = keyCheck(newLock, key);
            if (answer)
                break;
        }
        return answer;
    }
}
cs

key를 회전하는 것은 쉬웠는데, 회전한 key를 lock과 비교하는 것이 어려웠다.

 

비교를 쉽게 하기 위하여 기존의 lock을 key의 크기에 비례하여 확장하여 비교하였다.

또한 loop문을 쉽게 빠져나가기 위하여 Label을 사용하였다.

 

참고 사이트 : https://jellyinghead.tistory.com/28

'Programmers > Level3' 카테고리의 다른 글

[1차] 추석 트래픽  (0) 2021.09.08
길 찾기 게임  (0) 2021.09.07
징검다리 건너기  (0) 2021.08.26
N으로 표현  (0) 2021.08.25
단속카메라  (0) 2021.08.24