프로그래머스 | 행렬 테두리 회전하기 (Java)

mul·2023년 9월 26일
0

코딩테스트연습

목록 보기
53/56

🔒문제

프로그래머스 LV2. 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 행렬 테두리 회전하기

🔑해결

행렬의 행 개수 rows, 열 개수 columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전들에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return하는 solution 함수를 작성하는 문제이다.

  1. 주어진 행, 열 개수에 맞는 행렬 matrix를 만들고 (1~rows*columns)의 수로 초기화
  2. queries 배열에 주어진 행열 범위의 테두리를 rotation 메서드를 만들어 회전
  3. 숫자를 이동시킬 때마다 숫자가 해당 회전의 최솟값 min보다 작은 지 확인하고, min을 return한다.
  4. return된 최솟값 min을 answer 배열에 저장한다.

🔓코드

class Solution {
    int[][] matrix;
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        
        // matrix 초기화
        matrix = new int[rows][columns];
        int n = 1;
        for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[i].length; j++) {
				matrix[i][j] = n++;
			}
		}
        
        for (int i = 0; i < queries.length; i++) {
			int min = rotation(queries[i][0]-1, queries[i][1]-1, queries[i][2]-1, queries[i][3]-1);
			answer[i] = min;
			
		}
        
        return answer;
    }
    
    private int rotation(int x1, int y1, int x2, int y2) {
    	int min = matrix[x1][y1];
    	
    	// 상좌우
    	int stored = min;
    	for (int i = y1+1; i <= y2; i++) {
    		if(stored < min) {
    			min = stored;
    		}
    		int tmp = matrix[x1][i];
			matrix[x1][i] = stored;
			stored = tmp;
		}
    	
    	// 우상하
    	for (int i = x1+1; i <= x2; i++) {
    		if(stored < min) {
    			min = stored;
    		}
			int tmp = matrix[i][y2];
			matrix[i][y2] = stored;
			stored = tmp;
		}
    	
    	// 하우좌
    	for (int i = y2-1; i >= y1; i--) {
    		if(stored < min) {
    			min = stored;
    		}
			int tmp = matrix[x2][i];
			matrix[x2][i] = stored;
			stored = tmp;
		}
    	
    	// 좌하상
    	for (int i = x2-1; i >= x1; i--) {
    		if(stored < min) {
    			min = stored;
    		}
			int tmp = matrix[i][y1];
			matrix[i][y1] = stored;
			stored = tmp;
		}
    	
    	return min;
    }
}

0개의 댓글