ALGORITHM/PROGRAMMERS

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

0298 2021. 8. 6. 18:45

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

2021-08-06


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*;
 
class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int index = 1;
        int[][] arr = new int[rows][columns];
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < columns; j++){
                arr[i][j] = index++;
            }
        }
 
        LinkedList<Integer> list = new LinkedList<>();
 
        for(int p = 0; p < queries.length; p++) {
            int x1 = queries[p][0- 1;
            int y1 = queries[p][1- 1;
            int x2 = queries[p][2- 1;
            int y2 = queries[p][3- 1;
            answer[p] = 987654321;
            for(int i = y1; i <= y2; i++) {
                list.add(arr[x1][i]);
                answer[p] = Math.min(answer[p], arr[x1][i]);
            }
            for(int i = x1+1; i <= x2; i++) {
                list.add(arr[i][y2]);
                answer[p] = Math.min(answer[p], arr[i][y2]);
            }
            for(int i = y2-1; i >= y1; i--) {
                list.add(arr[x2][i]);
                answer[p] = Math.min(answer[p], arr[x2][i]);
            }
            for(int i = x2-1; i >= x1+1; i--) {
                list.add(arr[i][y1]);
                answer[p] = Math.min(answer[p], arr[i][y1]);
            }
            list.addFirst(list.removeLast());
 
            int idx = 0;
            for(int i = y1; i <= y2; i++) arr[x1][i] = list.get(idx++);
            for(int i = x1+1; i <= x2; i++) arr[i][y2] = list.get(idx++);
            for(int i = y2-1; i >= y1; i--) arr[x2][i] = list.get(idx++);
            for(int i = x2-1; i >= x1+1; i--) arr[i][y1] = list.get(idx++);
 
            list.clear();
        }
 
        return answer;
    }
}
cs

#문제풀이

행렬을 돌리는 구역을 4부분으로 나누고, LinkedList에 돌려야 하는 행렬 값들을 차례 대로 넣었다.

 

리스트에 값을 넣으면서 최솟값을 체크했고, 리스트에 모두 넣은 후 맨 마지막 값을 앞으로 보냈다. 

 

마지막으로 리스트에 넣은 값들을 다시 차례대로 행렬에 넣었다.