문제 : https://programmers.co.kr/learn/courses/30/lessons/60059
문제 유형 : 시뮬레이션
풀이 방식
N = Lock 사이즈
M = Key 사이즈
Key 배열, Lock 배열, Map 배열
(1) Lock 을 9개 만든다 생각하고 가운데에는 Lock정보를 입력 (Lock의 0의갯수 카운트, 0자리에 2를넣어줌)
=> M+M+N사이즈로 했었는데 M은 항상 N이하이므로 3N으로 해야됨
(2) key배열을 90도 회전하는 메소드를 만든다.
(3) Map 배열 0행 0열 부터 3*N-1행 3*N-1열 까지 차례대로 key값과 비교 (key[i2][j2]가 1일때 Lock의 2이면 카운팅해서 처음 Lock의 0의개수 카운팅한것과 비교)
=> 기준은 key의 0행0열부터 => 4중 for문
소스 코드
package Programmers;
import java.util.Arrays;
public class 좌물쇠와열쇠_2020_KAKAO_BLIND_RECRUITMENT {
private static int[][] k;
private static int M;
private static int N;
public static void main(String[] args) {
int[][] key= {{0,0,0},{1,0,0},{0,1,1}};
int[][] lock = {{1,1,1}, {1,1,0}, {1,0,1}};
System.out.println(solution(key, lock));
}
private static boolean solution(int[][] key, int[][] lock) {
boolean answer = false;
M = key.length;
N = lock.length;
int[][] map = new int[3*N][3*N];
int count = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map[N+i][N+j] = lock[i][j];
if(lock[i][j]==0) {
map[N+i][N+j]=2;
count++;
}
}
}
k = key;
int turn=0;
loop: while(true) {
k = turn(k);
for (int i = 0; i < 3*N; i++) {
for (int j = 0; j < 3*N; j++) {
int cnt=0;
forloop: for (int i2 = 0; i2 < M; i2++) {
for (int j2 = 0; j2 < M; j2++) {
if(i2+i<3*N&&j2+j<3*N) {
if(map[i+i2][j+j2]==1&&k[i2][j2]==1) break forloop;
if(map[i+i2][j+j2]==2&&k[i2][j2]==1) cnt++;
}
}
}
if(cnt==count) {
answer=true;
break loop;
}
}
}
turn++;
if(turn==4) break;
}
return answer;
}
private static int[][] turn(int[][] key_clone) {
int[][] key90 = new int[M][M];
for (int i = 0; i < M; i++) {
int[] arr = key_clone[i];
for (int j = 0; j < M; j++) {
key90[j][M-1-i] = arr[j];
}
}
return key90;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[MySQL]프로그래머스_우유와요거트가 담긴 장바구니 (0) | 2020.08.28 |
---|---|
[MySQL]프로그래머스_최댓값 구하기 (0) | 2020.08.28 |
[MySQL]프로그래머스_아픈동물찾기 (0) | 2020.08.28 |
[MySQL]프로그래머스_역순정렬하기 (0) | 2020.08.28 |
[MySQL]프로그래머스_모든레코드 조회하기 (0) | 2020.08.28 |