무려 5중 for 문을 돌았다...

 

따로 함수를 만들 수 도 있었지만, 일단 머릿속에서 논리가 시작되고나니

 

따로 만들면 더 헷갈릴 것 같아서 그냥 5중 for 문을 돌았다.

 

설명은 미안하지만 구체적이지 않음ㅠㅠ

 

이 문제의 요지는, 서로 더해 줄 key 의 위치와 lock 의 위치를 선점하는 수학 공식을 만드는 것.

 

수학 문제다.

 

createKey는 그냥 90도 씩 도는 2차원배열을 4개 만드는 함수임.

 

8, 9 번째 줄에 x와 y의 범위가 -n+1 <= ~ <m 인 것과

 

15 번째 줄에 keys 의 위치가 [x+a][y+b] 라는 것을 밝히는 것이 문제의 핵심이었다.

 

이 둘을 알아야 lock 과 key의 위치를 10 번째 줄에 있는 check[][] 에 더할 수 있고,

 

나중에 check[][] 의 원소들이 모두 1인지 확인되면 true 를 반환할 수 있는 것이다.

 

 

 

 

자물쇠와 열쇠 : https://programmers.co.kr/learn/courses/30/lessons/60059

 

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
class Solution {
    public boolean solution(int[][] key, int[][] lock) {
        int m = key.length;
        int n = lock.length;
        int[][][] keys = createKeys(key);
 
        for(int k=0; k<4; k++) {
            for (int x = -n+1; x < m; x++) {
                for (int y = -n+1; y < m; y++) {
                    int[][] check = new int[n][n];
                    for(int a = 0; a<n; a++) {
                        for(int b=0; b<n; b++) {
                            check[a][b]+=lock[a][b];
                            if(x+a>=0 && y+b>=0 && x+a<&& y+b<m) {
                                check[a][b]+=keys[k][x+a][y+b];
                            }
                        }
                    }
                    boolean flag = true;
                    for(int i=0; flag && i<n; i++) {
                        for(int j=0; flag && j<n; j++) {
                            if(check[i][j]!=1) flag=false;
                        }
                    }
                    if(flag) return true;
                }
            }
        }
        
        return false;
    }
 
    public  int[][][] createKeys(int[][] key) {
        int m = key.length;
        int[][][] keys = new int[4][m][m];
 
        keys[0= key;
        for (int i = 1; i < 4; i++) {
            int[][] from = keys[i - 1];
            int[][] to = keys[i];
 
            for (int x = 0; x < m; x++) {
                for (int y = 0; y < m; y++) {
                    to[y][m - 1 - x] = from[x][y];
                } // y
            } // x
        } // i
        return keys;
    }
}
cs

 

+ Recent posts