프로그래밍 공방

[프로그래머스] 자물쇠와 열쇠 본문

개발/문제해결

[프로그래머스] 자물쇠와 열쇠

hyosupsong 2020. 11. 22. 23:59

문제

programmers.co.kr/learn/courses/30/lessons/60059

 

코딩테스트 연습 - 자물쇠와 열쇠

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr

문제해결방법

1. 열쇠의 크기를 M, 자물쇠의 크기를 N이라고 했을때, M+2*N 길이의 이차 배열을 만들어 준다.

2. 가운데에 키를 두고 자물쇠를 좌측 맨 위부터 우측 M+N 까지 돌면서 키로 열리는지 확인한다.

3. 위 과정을 키를 회전시켜가며 반복한다.

4. 반복 중에 자물쇠가 열린다면 true, 열리지 않는다면 false를 반환한다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package Programmers;
 
public class Solution_자물쇠와열쇠 {
 
    public static int N, M;
    public static int[][] lockMap;
    
    public static void rotation(int[][] map, int i, int j, int length) {
        int[] num = new int[length*length];
        int index = 0;
        for(int x = 0; x<length; x++) {
            for(int y=0; y<length; y++) num[index++= map[x+i][y+j];
        }
        index = 0;
        for(int x = length-1; x>=0; x--) {
            for(int y=0; y<length; y++) map[y+i][x+j] = num[index++];
        }
    }
    
    public static boolean solution(int[][] key, int[][] lock) {
        boolean answer = false;
        N = lock.length;
        M = key.length;
        lockMap = new int[M+2*N][M+2*N];
        for(int i=0; i<key.length; i++) {
            for(int j=0; j<key[i].length; j++) lockMap[i+N][j+N] = key[i][j];
        }
        rot:for(int r=0; r<4; r++) {
            for(int i=0; i<lockMap.length-N; i++) {
                loop:for(int j=0; j<lockMap[i].length-N; j++) {
                    for(int li=0; li<lock.length; li++) {
                        for(int lj=0; lj<lock[li].length; lj++) {
                            if((lock[li][lj]^lockMap[i+li][j+lj])==0continue loop;
                        }
                    }
                    answer = true;
                    break rot;
                }
            }
            rotation(lockMap, N, N, key.length);
        }
        return answer;
    }
    
    public static void main(String[] args) {
        int[][] key = {{000}, {100}, {011}};
        int[][] lock = {{111}, {110}, {101}};
        System.out.println(solution(key, lock));
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.