프로그래머스 - 자물쇠와 열쇠 - Java

chaemin·2024년 3월 14일
0

프로그래머스

목록 보기
7/64

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/60059

2. 풀이

참고 풀이
https://mjmjmj98.tistory.com/150
https://github.com/ndb796/python-for-coding-test/blob/master/12/4.java

말 그대로 구현이지만 다소 까다로웠다.
✨키포인트는 배열을 90도씩 회전하는 코드이다.

for(int i = 0; i < n; i++) {
	for(int j = 0; j < m; j++) {
		result[j][n - i - 1] = arr[i][j];
	}
}

3. 코드

import java.util.*;

class Solution {
    
    public boolean solution(int[][] key, int[][] lock) {
        int N = lock.length;
		int M = key.length;
		
		/**
		 * 1. 제일 큰 new_lock배열을 선언
		 */
		int new_lock[][] = new int[N * 3][N * 3];
		
		/**
		 * 2. new_lock 중앙 부분에다가 lock배열을 넣어준다.
		 */
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				new_lock[i + N][j + N] = lock[i][j];
			}
		}
		
		boolean answer = false;
		
		/**
		 * 3. 90씩 4번 회전하여 회전 방향에 따라서 확인해보기
		 */
		for(int r = 0; r < 4; r++) {
			
			//3-1. 90도씩 회전시키기
			key = rotate_array(key);
			
			//3-2. 열쇠 배열을 왼쪽 위부터 시작해서 한 칸씩 이동하며
			for(int x = 0; x < N * 2; x++) {
				
				for(int y = 0; y < N * 2; y++) {
					
					//3-3. 자물쇠의 모든 홈을 채울 수 있는지 확인 
					for(int i = 0; i < M; i++) {
						
						for(int j = 0; j < M; j++) {
							
							new_lock[x + i][y + j] += key[i][j];
						}
					}
					
					//3-4. 더한 결과를 확인했을 때 자물쇠 부분의 모든 값이 정확히 1인지 확인.
					if(check_1(new_lock))
						answer = true;
					
					//3-5. 자물쇠에서 열쇠를 다시 빼기
					for(int i = 0; i < M; i++) {
						
						for(int j = 0; j < M; j++) {
							
							new_lock[x + i][y + j] -= key[i][j];
						}
					}
				}
				
			}
		}
        return answer;
    }
    
    public static boolean check_1(int a[][]) {
		
		int length = a.length / 3;
		
		for(int i = length; i < length * 2; i++) {
			
			for(int j = length; j < length * 2; j++) {
				
				if(a[i][j] != 1)
					return false;
			}
		}
		
		return true;
	}
	
	public static int[][] rotate_array(int a[][]) {
		int n = a.length;
		int m = a[0].length;
		
		int result[][] = new int[n][m];
		
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) 
				result[j][n - i - 1] = a[i][j];
		}
		
		return result;
	}    
}

0개의 댓글