Link: 자물쇠와 열쇠
열쇠를 회전 + 이동 시켜서 자물쇠의 홈을 정확히 맞추고, 돌기 끼리는 겹치지 않아야 한다.
자물쇠의 영역이 모두 1이 되면 열기 성공.



for (i in 0 until lockSize) {
for (j in 0 until lockSize) {
board[i + keySize][j + keySize] = lock[i][j]
}
}
보드 중앙에 자물쇠 모양 붙여넣기
private fun rotate(key: Array<IntArray>): Array<IntArray> {
val n = key.size
val rotated = Array(n) { IntArray(n) }
for (i in 0 until n) {
for (j in 0 until n) {
rotated[j][n - i - 1] = key[i][j]
}
}
return rotated
}
private fun applyKey(board: Array<IntArray>, key: Array<IntArray>, x: Int, y: Int) {
for (i in key.indices) {
for (j in key.indices) {
board[x + i][y + j] += key[i][j]
}
}
}
열쇠 값을 보드에 덧셈. 예를 들어 key[i][j] 가 1이면 (i, j) 좌표를 1 증가시킨다.
private fun checkUnlocked(board: Array<IntArray>, offset: Int, size: Int): Boolean {
for (i in 0 until size) {
for (j in 0 until size) {
if (board[i + offset][j + offset] != 1) return false
}
}
return true
}
자물쇠 구역이 모두 1이면 자물쇠를 열었다고 판단함.

private fun removeKey(board: Array<IntArray>, key: Array<IntArray>, x: Int, y: Int) {
for (i in key.indices) {
for (j in key.indices) {
board[x + i][y + j] -= key[i][j]
}
}
}
자물쇠 구역 중 하나라도 1이 아니라면 열지 못했다고 판단하고, 열쇠를 제거.
var rotatedKey = key
repeat(4) {
rotatedKey = rotate(rotatedKey)
for (x in 0 until(boardSize - keySize + 1)) {
for (y in 0 until (boardSize - keySize + 1)) {
applyKey(board, rotatedKey, x, y)
if (checkUnlocked(board, keySize, lockSize)) return true
removeKey(board, rotatedKey, x, y)
}
}
}
열쇠를 회전시켜 보드 위 모든 좌표에 끼워넣기 시도.
자물쇠 영역이 모두 1인지 확인하고, 아니라면 원상태로 복구