[2020 KAKAO BLIND RECRUITMENT] 자물쇠와 열쇠

Titu·2021년 12월 8일
0

Algorithm

목록 보기
25/28

2020 KAKAO BLIND RECRUITMENT 자물쇠와 열쇠

유형

  • 이차원 배열

코드

class Solution {
    public boolean solution(int[][] key, int[][] lock) {
        boolean answer = false;

        // 자물쇠의 홈의 개수를 저장
        int numOfEmpty = getNumOfEmpty(lock);
        
        int startRow = 0;
        int startCol = 0;
        int numOfIteration = lock.length + key.length - 1;

        for (int rotate = 0; rotate < 4; rotate++) {
            key = rotate(key);

            for (int i = 0; i < numOfIteration; i++) {
                for (int j = 0; j < numOfIteration; j++) {
                    startRow = -key.length + 1 + i;
                    startCol = -key.length + 1 + j;

                    // 홈을 채운 횟수
                    int cnt = 0;
                    boolean stopflag = false;

                    for (int k = 0; k < key.length; k++) {
                        for (int l = 0; l < key.length; l++) {
                            if(k + startRow < 0) continue;
                            if(l + startCol < 0) continue;
                            if(k + startRow >= lock.length) continue;
                            if(l + startCol >= lock.length) continue;

                            if(key[k][l] == 1 && lock[startRow + k][startCol + l] == 0) {
                                cnt++;
                            } else if(key[k][l] == lock[startRow + k][startCol + l]) {
                                stopflag = true;
                                break;
                            }
                        }
                        if(stopflag) break;
                    }
                    // 홈을 모두 채웠을 경우
                    if(cnt == numOfEmpty) return true;
                }
            }
        }

        return answer;
    }

    private int getNumOfEmpty(int[][] arr) {
        int numOfEmpty = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[i][j] == 0) numOfEmpty++;
            }
        }
        return numOfEmpty;
    }

    private int[][] rotate(int[][] key) {
        int[][] newKey = new int[key.length][key.length];
        for (int i = 0; i < key.length; i++) {
            for (int j = 0; j < key.length; j++) {
                newKey[i][j] = key[j][key.length - 1 - i];
            }
        }
        return newKey;
    }
}
profile
This is titu

0개의 댓글