풀이
- 정방행렬을 회전하기 위해
rotateSquareMatrix
구현
lock
의 빈 부분의 수를 count
에 저장
- 0, 90, 180, 270 만큼 차례대로
key
를 회전 시킴
lock
을 확장한다고 생각하여 중첩 for문을 작성함
- 중첩 for문 안에
key
를 순회하여 일치 여부 확인함
lock
의 범위 밖이면 continue
key
의 돌기와 lock
의 돌기가 만나면 key
순회 break
- 일치하면
matches
증가시키고 matches
== count
면 true 반환
- 중첩 for문에서 true를 반환하지 못했으면 false 반환
class Solution {
public boolean solution(int[][] key, int[][] lock) {
int M = key.length;
int N = lock.length;
int count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (lock[i][j] == 0) {
count++;
}
}
}
for (int degree = 0; degree < 360; degree += 90) {
int[][] rotatedKey;
if (degree == 0) {
rotatedKey = key;
} else {
rotatedKey = rotateSquareMatrix(key, degree, M);
}
for (int i = 0 - M + 1; i < N; i++) {
for (int j = 0 - M + 1; j < N; j++) {
int matches = 0;
boolean isMatch = true;
for (int k = 0; k < M; k++) {
for (int l = 0; l < M; l++) {
if (i + k < 0 || i + k >= N || j + l < 0 || j + l >= N) {
continue;
}
if (rotatedKey[k][l] == 1 && lock[i + k][j + l] == 1) {
isMatch = false;
break;
}
if (rotatedKey[k][l] == 1 && lock[i + k][j + l] == 0) {
matches++;
}
}
if (!isMatch) {
break;
}
}
if (matches == count) {
return true;
}
}
}
}
return false;
}
public int[][] rotateSquareMatrix(int[][] matrix, int degree, int size) {
int[][] rotatedMatrix = new int[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
switch (degree) {
case 90:
rotatedMatrix[i][j] = matrix[size - 1 - j][i];
break;
case 180:
rotatedMatrix[i][j] = matrix[size - 1 - i][size - 1 - j];
break;
case 270:
rotatedMatrix[i][j] = matrix[j][size - 1 - i];
break;
}
}
}
return rotatedMatrix;
}
}