본문 바로가기
알고리즘연습/Programmers

[프로그래머스] 행렬테두리 회전하기 java 자바

by 밈밈무 2021. 6. 26.

문제

https://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

문제 설명

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

  • x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

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

 

제한사항

  • rows는 2 이상 100 이하인 자연수입니다.
  • columns는 2 이상 100 이하인 자연수입니다.
  • 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
    • 즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
  • queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
  • queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
    • x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
    • 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
    • 모든 회전은 순서대로 이루어집니다.
    • 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.

풀이

더 간단하게 풀 수 있는 방법이 있는지는 모르겠는데 내가 느낀 바로는 그냥 직관적으로 풀면 되는 것 같다. 사각형의 범위를 정하고 그 테두리에 있는 숫자들을 시계방향으로 옮기면 돼서 각 변마다 for문을 이용해서 위치를 이동시켜주었다. 이때 <윗변->오른쪽변->아랫변->왼쪽변> 이 순서대로 옮기게 되면 각 변의 끝에 있는 값을 계속 저장해주어야 하므로 <왼쪽변->아랫변->오른쪽변->윗변> 의 순서로 이동시켜 주었다. 이렇게 이동하게 되면 가장 왼쪽 위에 있는(arr[row1][col1])의 값만 저장해두었다가 마지막에 이동시켜주면 된다.

코드

import java.util.*;
class Solution {
public static int[] solution(int rows, int columns, int[][]queries) {
		int[] answer= {};
		answer=new int[queries.length];

		//행렬만들기
		int[][] arr=new int[rows][columns];
		for(int i=0;i<rows;i++) {
			for(int j=0;j<columns;j++) {
				arr[i][j]=(i)*columns+j+1;
			}
		}
		
		
		for(int i=0;i<queries.length;i++) {
			int row1=queries[i][0]-1;
			int col1=queries[i][1]-1;
			int row2=queries[i][2]-1;
			int col2=queries[i][3]-1;
			
			ArrayList<Integer>move=new ArrayList<>();
			
			int tmp=arr[row1][col1];
			for(int r=row1;r<row2;r++) {
				arr[r][col1]=arr[r+1][col1];
				move.add(arr[r][col1]);
			}			
			for(int c=col1;c<col2;c++) {
				arr[row2][c]=arr[row2][c+1];
				move.add(arr[row2][c]);
			}
			
			for(int r=row2;r>row1;r--) {
				arr[r][col2]=arr[r-1][col2];
				move.add(arr[r][col2]);
			}
			
			for(int c=col2;c>col1+1;c--) {
				arr[row1][c]=arr[row1][c-1];
				move.add(arr[row1][c]);
			}
			arr[row1][col1+1]=tmp;
			move.add(arr[row1][col1+1]);
			
			Collections.sort(move);
			answer[i]=move.get(0);
		}

		
		return answer;
	}
}