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

민지킴·2021년 4월 29일
0

프로그래머스

목록 보기
22/42
post-thumbnail

문제 링크

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

문제 풀이

구현문제 풀듯이 접근했다.
map을 먼저 만들고 시계방향으로 도는 방법을 diry, dirx 를 통해서
우,하,좌,상 으로 좌표가 이동하도록 했다.

        int [] diry={0,1,0,-1};
        int [] dirx={1,0,-1,0};

i를 변수로 가지는 for문은 queries만큼 반복하는 반복문이다.
i-for문이 돌때마다 변수값들이 다시 세팅된다.

j를 변수로 가지는 for문은 시계방향으로 도는 인덱스를 잡아주는 for문이다.
j가 짝수일때는 오른쪽, 왼쪽 / j가 홀수일때는 아래, 위 방향으로만 움직인다.

이동한 값으로 기존에 있는 값이 덮어지게 되므로 temp는 값이 덮어지기전에 기존에 있는값을 저장해둔다. 단 최초 이동시엔 0으로 세팅해둔다.

start_y, start_x는 최초로 시작하거나, 이전위치
now_y, now_x는 시계방향으로 한칸 이동한 후의 위치이다.
temp2는 값의 원활한 swap을 위해서 추가했다.
temp2는 이동한 후의 값을 저장하고 그 값을 temp와 바꿔주는 역할을 한다.

int now_y = start_y + diry[j];
int now_x = start_x + dirx[j];                     
int temp2 = map[now_y][now_x];
map[now_y][now_x] = temp;
temp=temp2;

이동한 후에는 현재위치가 다음 반복문에서의 이전 위치가 된다.

start_y = now_y;
start_x = now_x; 

반복문을 돌때마다 최소값을 비교해가며 돌며 i반복문이 한바퀴 돌때마다 answer[i]에 해당 값을 저장한다.


코드

import java.util.*;

class Solution {

    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int [][] map = new int[rows][columns];
        int idx =1;
        int [] diry={0,1,0,-1};
        int [] dirx={1,0,-1,0};
        
        for(int i=0; i<map.length;i++){
            for(int j=0; j<map[0].length; j++){
                map[i][j] =idx++;
            }
        }
        
        for(int i=0; i<queries.length; i++){
            int start_y = queries[i][0]-1;
            int start_x = queries[i][1]-1;
            int minnum = Integer.MAX_VALUE;
            int temp =0;
            
            for(int j=0; j<4; j++){
                if(j%2==0){
                    for(int p=0; p<queries[i][3]-queries[i][1]; p++){              
                        int now_y = start_y + diry[j];
                        int now_x = start_x + dirx[j];
                        if(temp==0){
                            temp = map[now_y][now_x];
                            map[now_y][now_x] = map[start_y][start_x];
                            start_y = now_y;
                            start_x = now_x;
                        }else{        
                            int temp2 = map[now_y][now_x];
                            map[now_y][now_x] = temp;
                            temp=temp2;
                            start_y = now_y;
                            start_x = now_x; 
                        } 
                        minnum = Math.min(minnum,temp);
                     }//p            
                }else{
                    for(int k=0; k<queries[i][2]-queries[i][0]; k++){
                        int now_y = start_y + diry[j];
                        int now_x = start_x + dirx[j];                        
                        int temp2 = map[now_y][now_x];
                        map[now_y][now_x] = temp;
                        temp=temp2;
                        start_y = now_y;
                        start_x = now_x;  
                        minnum = Math.min(minnum,temp);
                    }//k
                }//j-else
            }//j
            answer[i] = minnum;
        }//i 
        return answer;
    }
}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글