무려 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<m && 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 |
'Coding Interview' 카테고리의 다른 글
[IT] CS 면접 대비 Database 질문 모음 (0) | 2021.12.29 |
---|---|
코딩 검사할 때 엣지케이스 찾기 리스트 (0) | 2020.06.14 |
[SW Expert Academy] 2112. [모의 SW 역량테스트] 보호 필름 (0) | 2020.06.05 |
[SW Expert Academy] 2477. [모의 SW 역량테스트] 차량 정비소 (0) | 2020.06.04 |
[JAVA] 전체 값을 나열하는 순열 코드 (0) | 2020.04.27 |