[프로그래머스(Programmers)][자바(java)] (Lv2) 행렬 테두리 회전하기 <2021 Dev-Matching: 웹 백엔드 개발자(상반기)>

728x90

 

programmers.co.kr/learn/courses/30/lessons/77485

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

문제 풀이

 

public class Solution {
	
	public static int[] solution(int rows, int columns, int[][] queries) {
		int b[][] = new int[rows][columns], i, j, c = 0;
		for( i = 0; i < rows; i++ )
			for( j = 0; j < columns; j++ )
				b[i][j] = ++c;
		int q = queries.length, x1, y1, x2, y2, x, y, tmp, val, val_min;
		int answer[] = new int[q];
		for( i = 0; i < q; i++ ) {
			x1 = --queries[i][0];
			y1 = --queries[i][1];
			x2 = --queries[i][2];
			y2 = --queries[i][3];
			val_min = tmp = b[x1][y1];
			for( x = x1; x < x2; x++ ) {
				val = b[x][y1];
				val_min = val_min > val ? val : val_min;
				b[x][y1] = b[x+1][y1];
			}
			for( y = y1; y < y2; y++ ) {
				val = b[x2][y];
				val_min = val_min > val ? val : val_min;
				b[x2][y] = b[x2][y+1];
			}
			for( x = x2; x > x1; x-- ) {
				val = b[x][y2];
				val_min = val_min > val ? val : val_min;
				b[x][y2] = b[x-1][y2];
			}
			for( y = y2; y > y1; y-- ) {
				val = b[x1][y];
				val_min = val_min > val ? val : val_min;
				b[x1][y] = b[x1][y-1];
			}
			b[x][y+1] = tmp;
			answer[i] = val_min;
		}
		return answer;
	}
}

 

┌  시계 방향으로 이동  =>  한 칸씩 밀기
└  반 시계 방향으로 이동  =>  한 칸씩 땡기기

-  (x1, y1) 에서 (x2, y2) 까지 반 시계 방향으로 테두리를 탐색하며 최솟값을 구함과 동시에 값을 한 칸씩 떙김 

-  x++ -> y++ -> x-- -> y--

 

 

반응형