프로그래머스 - (Java)자물쇠와 열쇠
알고리즘/프로그래머스

프로그래머스 - (Java)자물쇠와 열쇠

https://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. 유형

구현

 

2. 시뮬레이션

위처럼 전체 맵을 만들고 key를 이동하면서 lock에 대입해보면서 판단한다.

 

 

로직

  1. key가 평행이동할 전체 맵을 완전탐색한다
  2. key를 90도 돌려준다
  3. key와 lock이 맞는지 확인한다

3. 코드

class Solution {
    public boolean solution(int[][] key, int[][] lock) {
        boolean answer = false;
        int keylen=key.length;
        int locklen=lock.length;
    out:for(int i=0; i<locklen+keylen-1; i++){
            for(int j=0; j<locklen+keylen-1; j++){
                for(int k=0; k<4; k++){
                    key = rotate(key);
                    int map[][] = new int[58][58];
                    setmap(map, key, lock, i, j);
                    if(check(map, keylen-1, locklen)){
                        answer = true;
                        break out;
                    }
                }
            }
        }
        return answer;
    }
    static int[][] rotate(int[][] key){
        int N = key.length;
        int temp[][] = new int[N][N];
        for(int i=0; i<N; ++i){
            for(int j=0; j<N; ++j){
                temp[j][N-i-1] = key[i][j];
            }
        }
        return temp;
    }
    static void setmap(int map[][], int key[][], int lock[][], int r, int c){
        int offset = key.length-1;
        for(int i=0; i<key.length; i++){
            for(int j=0; j<key.length; j++){
                map[i+r][j+c]+=key[i][j];
            }
        }
        for(int i=0; i<lock.length; i++){
            for(int j=0; j<lock.length; j++){
                map[i+offset][j+offset]+=lock[i][j];
            }
        }
    }
    static boolean check(int[][] map, int offset, int locklen){
        for(int i=offset; i<offset+locklen; i++){
            for(int j=offset; j<offset+locklen; j++){
                if(map[i][j]!=1){
                    return false;
                }
            }
        }
        return true;
    }
}

// 1. 전체맵 2차원탐색, 맵 안나가는 범위만.
// 2. 키 로테이션
// 3. 대입
// 4. 판단

새롭게 배운점은 맵을 벗어나는 부분을 예외처리 하기 보단,

큰 맵을 생성하는 것이 더 깔끔하다