https://programmers.co.kr/learn/courses/30/lessons/60059
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. 판단
새롭게 배운점은 맵을 벗어나는 부분을 예외처리 하기 보단,
큰 맵을 생성하는 것이 더 깔끔하다
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - (Java) 가장 긴 팰린드롬 (0) | 2021.06.13 |
---|---|
프로그래머스 - (Java)여행경로 (0) | 2021.06.13 |
프로그래머스 - (Java)입국심사 (0) | 2021.06.12 |
프로그래머스 - (Java) 경주로 건설 (0) | 2021.06.09 |
프로그래머스 - (Java) 보석쇼핑 (0) | 2021.06.08 |