https://school.programmers.co.kr/learn/courses/30/lessons/60059
참고 풀이
https://mjmjmj98.tistory.com/150
https://github.com/ndb796/python-for-coding-test/blob/master/12/4.java
말 그대로 구현이지만 다소 까다로웠다.
✨키포인트는 배열을 90도씩 회전하는 코드이다.
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
result[j][n - i - 1] = arr[i][j];
}
}
import java.util.*;
class Solution {
public boolean solution(int[][] key, int[][] lock) {
int N = lock.length;
int M = key.length;
/**
* 1. 제일 큰 new_lock배열을 선언
*/
int new_lock[][] = new int[N * 3][N * 3];
/**
* 2. new_lock 중앙 부분에다가 lock배열을 넣어준다.
*/
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
new_lock[i + N][j + N] = lock[i][j];
}
}
boolean answer = false;
/**
* 3. 90씩 4번 회전하여 회전 방향에 따라서 확인해보기
*/
for(int r = 0; r < 4; r++) {
//3-1. 90도씩 회전시키기
key = rotate_array(key);
//3-2. 열쇠 배열을 왼쪽 위부터 시작해서 한 칸씩 이동하며
for(int x = 0; x < N * 2; x++) {
for(int y = 0; y < N * 2; y++) {
//3-3. 자물쇠의 모든 홈을 채울 수 있는지 확인
for(int i = 0; i < M; i++) {
for(int j = 0; j < M; j++) {
new_lock[x + i][y + j] += key[i][j];
}
}
//3-4. 더한 결과를 확인했을 때 자물쇠 부분의 모든 값이 정확히 1인지 확인.
if(check_1(new_lock))
answer = true;
//3-5. 자물쇠에서 열쇠를 다시 빼기
for(int i = 0; i < M; i++) {
for(int j = 0; j < M; j++) {
new_lock[x + i][y + j] -= key[i][j];
}
}
}
}
}
return answer;
}
public static boolean check_1(int a[][]) {
int length = a.length / 3;
for(int i = length; i < length * 2; i++) {
for(int j = length; j < length * 2; j++) {
if(a[i][j] != 1)
return false;
}
}
return true;
}
public static int[][] rotate_array(int a[][]) {
int n = a.length;
int m = a[0].length;
int result[][] = new int[n][m];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++)
result[j][n - i - 1] = a[i][j];
}
return result;
}
}