알고리즘/프로그래머스 Level2

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

류창 2021. 9. 28. 20:50
반응형

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

문제분석

문제가 길어서 링크로 대체하겠습니다.

 

문제설명은 가로,세로 길이가 주어진 2차원배열이 주어집니다.

2차원배열은 1부터 가로X세로까지 +1씩 채워져있습니다.

 

이 2차원배열을 쿼리[x1,y1,x2,y2] 에 따라 회전시키고, 회전이 종료하고 움직인 숫자들중 가장 낮은숫자를 answer

배열에 추가합니다. 

 

모든 쿼리를 순회했다면, answer을 반환합니다.

 

 

본인의 접근법:

2차원배열의 회전알고리즘을 구글링해서 적용하려다가. . .

테두리만 회전해야 하기에 새로 구현했습니다.

 

테두리를 회전하기위해선, 현재 위치하고있는 숫자를  저장하다가, 다음 위치에있는 숫자에 도착하면

그 숫자와 서로 뒤바꿔야(Swap)하여합니다.

그래서 일일이 구현했습니다

문제풀이

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
52
53
54
55
56
57
58
import java.util.*;
class Solution {   
    int[][] board;   
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        board = new int[rows][columns];       
        int num=1;
        for(int i=0;i<rows;i++){
            for(int j=0;j<columns;j++){
                board[i][j]+=num++;
            }
        }        
        //쿼리 순회
        for(int i=0;i<queries.length;i++){           
         answer[i]=rotate(queries[i]);
        }                     
        return answer;
    }    
    public int rotate(int[] arr){
        int up_arr=arr[0];
        int left_arr=arr[1];
        int down_arr=arr[2];
        int right_arr=arr[3];        
        List<Integer> list =new ArrayList<>();        
        int hand=board[up_arr-1][left_arr-1];        
        int temp=0;        
        //상단 배열 순회
        for(int i=left_arr-1;i<right_arr;i++){
            list.add(hand);
            temp=hand;
            hand=board[up_arr-1][i];
            board[up_arr-1][i]=temp;    
        }        
        //오른쪽 배열 순회
        for(int i=up_arr;i<down_arr;i++){       
            list.add(hand);
            temp=hand;
            hand=board[i][right_arr-1];
            board[i][right_arr-1]=temp;          
        }
        //바닥 배열 순회        
        for(int i=right_arr-2;i>=left_arr-1;i--){  
            list.add(hand);
            temp=hand;
            hand=board[down_arr-1][i];
            board[down_arr-1][i]=temp;          
        }
        //왼쪽 배열 
        for(int i=down_arr-2;i>=up_arr-1;i--){  
            list.add(hand);
            temp=hand;
            hand=board[i][left_arr-1];
            board[i][left_arr-1]=temp;          
        }       
        Collections.sort(list);        
        return list.get(0);       
    }    
}
cs

먼저 전역변수 board에 1부터 차례대로 넣어서 초기 배열을 만들어둡니다.

그후, 쿼리를 순회합니다.

 

쿼리를 입력받으면 rotate메소드를 호출합니다.

 

rotate메소드엔  상단, 오른쪽 ,하단, 왼쪽 순으로 시계방향으로 배열이 이동되는것을 구현했습니다.

 

배열을 이동하는것을, swap(바꿔치기)알고리즘을 활용했습니다.

바꿔칠때마다 list에 넣은뒤에, 회전이 종료되기직전에, 가장낮은값을 반환합니다. 

 

반응형