[프로그래머스 / Level3] 자물쇠와 열쇠 (Java)

wannabeking·2022년 6월 7일
0

코딩테스트

목록 보기
11/155

문제 보기



풀이

  • 정방행렬을 회전하기 위해 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;
    }
}
profile
내일은 개발왕 😎

0개의 댓글