본문 바로가기

알고리즘/프로그래머스

[JAVA]프로그래머스_2020 KAKAO BLIND RECRUITMENT_좌물쇠와열쇠

문제 : 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

문제 유형 : 시뮬레이션

 

풀이 방식

N = Lock 사이즈

M = Key 사이즈

Key 배열, Lock 배열, Map 배열

 

(1) Lock 을 9개 만든다 생각하고 가운데에는 Lock정보를 입력 (Lock의 0의갯수 카운트, 0자리에 2를넣어줌)

=> M+M+N사이즈로 했었는데 M은 항상 N이하이므로 3N으로 해야됨

Map[3*N][3*N]

(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;
	}
}