본문 바로가기

PS/프로그래머스

프로그래머스 2020 KAKAO BLIND RECRUITMENT - 자물쇠와 열쇠[JAVA]

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/60059

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드:

 

class Solution {
    public boolean solution(int[][] key, int[][] lock) {
        for (int i = 0; i < 4; i++) {
            rotate(key);
            if (check(key, lock)) {
                return true;
            }
        }
        return false;

    }

    public boolean check(int[][] key, int[][] lock) {
        int len = key.length + 2 * (lock.length - 1);
        int[][] tmpKey = new int[len][len];
        for (int i = lock.length - 1; i < lock.length - 1 + key.length; i++) {
            for (int j = lock.length - 1; j < lock.length - 1 + key.length; j++) {
                tmpKey[i][j] = key[i - lock.length + 1][j - lock.length + 1];
            }
        }
        for (int i = 0; i <= tmpKey.length - lock.length; i++) {
            label : for (int j = 0; j <= tmpKey.length - lock.length; j++) {
                int[][] tmpLock = new int[lock.length][lock.length];
                copy(tmpLock, lock);
                for (int r = 0; r < lock.length; r++) {
                    for (int l = 0; l < lock.length; l++) {
                        if(tmpKey[i+r][j+l] * tmpLock[r][l] == 1) continue label;
                        if(tmpKey[i+r][j+l] == 1 && tmpLock[r][l] == 0){
                            tmpLock[r][l] = 1;
                        }
                    }
                }

                if(isOpen(tmpLock)) return true;

            }
        }
        return false;
    }

    private void print(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println("---------");

    }

    public boolean isOpen(int[][] tmpLock) {
        for (int i = 0; i < tmpLock.length; i++) {
            for (int j = 0; j < tmpLock.length; j++) {
                if(tmpLock[i][j] == 0) return false;
            }

        }
        return true;
    }

    public void copy(int[][] to, int[][] from) {
        for (int i = 0; i < from.length; i++) {
            for (int j = 0; j < from.length; j++) {
                to[i][j] = from[i][j];
            }
        }
    }

    public void rotate(int[][] key) {
        int[][] tmp = new int[key.length][key[0].length];
        for (int i = 0; i < key.length; i++) {
            for (int j = 0; j < key.length; j++) {
                tmp[j][key[0].length - 1 - i] = key[i][j];
            }
        }
        for (int i = 0; i < key.length; i++) {
            for (int j = 0; j < key.length; j++) {
                key[i][j] = tmp[i][j];
            }
        }
    }
}