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 |