
https://school.programmers.co.kr/learn/courses/30/lessons/60059
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이문제는 자물쇠에 해당하는 조합을 찾는 문제이다.
key[][] 와 lock[][] 이 주어질때 key를 90도 단위로 돌려가며
lock에 맞추었을때 빈틈없이 맞아 진다면 true 를 반환하고 false를 반환하는
문제다.
단순 구현 풀이법으로 문제를 풀이하였으며
회전하는 과정에서 90도, 180도, 270도 회전시 어떻게 체크를 해줄지
생각을 해낸다면 쉽게 풀이할 수 있다.
int[][] checkLock 을 선언하고 key를 90도로 돌려가며 모든 값을 더해
주었을때 Lock에 해당하는 범위의 배열공간이 1로 가득차있다면 true를 리턴
아니라면 false를 리턴하면서 문제를 풀이하였다.
check함수는 확장된 checkLock에 회전한 key를 ++해주어 겹치면 2가되고 겹치지않고 채워지지
않으면 0이된다.
isVaild 함수에서는 lock에 해당하는 공간이 1로 가득차 있는지 없는지 검증하는
메서드이다.
import java.util.*;
class Solution {
public boolean solution(int[][] key, int[][] lock) {
int point = key.length - 1;
for(int x = 0 ; x < point + lock.length; x++){
for(int y = 0 ; y < point + lock.length; y++){
for(int r = 0 ; r < 4; r++){
int size = lock.length+(key.length*2);
int[][] checkLock = new int[size][size];
for(int i = point ; i < point+lock.length; i++){
for(int j = point ; j < point+lock.length; j++){
checkLock[i][j] = lock[i-point][j-point];
}
}
check(checkLock,key,r,x,y);
if(isVaild(checkLock,point,lock.length)) return true;
}
}
}
return false;
}
public void check(int[][] checkLock,int[][] key, int r, int x, int y){
int len = key.length;
for(int i = 0 ; i < len ; i++){
for(int j = 0 ; j < len ; j++){
if(r == 0){
checkLock[x+i][y+j] += key[i][j];
}else if(r==1){
checkLock[x+i][y+j] += key[len-j-1][i];
}else if(r==2){
checkLock[x+i][y+j] += key[len-i-1][len-j-1];
}else if(r==3){
checkLock[x+i][y+j] += key[j][len-i-1];
}
}
}
}
public boolean isVaild(int[][] checkLock,int point, int len ){
for(int i = point ; i < point+len ; i++ ){
for(int j = point ; j < point+len ; j++ ){
if(checkLock[i][j] != 1) return false;
}
}
return true;
}
}
'Algorithm & Data Structures > Programers' 카테고리의 다른 글
Lv 3. 파괴되지 않은 건물 (0) | 2024.12.23 |
---|---|
Lv 3. 합승 택시 요금 (1) | 2024.12.18 |
Lv 3. 순위 (0) | 2024.12.10 |
p.퍼즐게임챌린지 (0) | 2024.12.06 |
Lv 3. 풍선 터트리기 (1) | 2024.12.04 |