알고리즘/프로그래머스
프로그래머스 - (Java)자물쇠와 열쇠
dev.moon
2021. 6. 12. 18:44
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에 대입해보면서 판단한다.
로직
- key가 평행이동할 전체 맵을 완전탐색한다
- key를 90도 돌려준다
- 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. 판단
새롭게 배운점은 맵을 벗어나는 부분을 예외처리 하기 보단,
큰 맵을 생성하는 것이 더 깔끔하다