본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[pro] 프로그래머스 level2 77485 행렬 테두리 회전하기 (Java) - 시뮬레이션

[문제]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[풀이]

회전 구현 시 처음 (r1, c1)값이 사라지지 않도록 temp에 저장해놓는다. 또한 값을 보전하기 위한 구현 순서(위, 왼쪽, 아래, 오른쪽 순서)와 이동 방향에 주의해야 한다.

 

[코드]

 

class Solution {
    int[][] map;
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = {};
        answer = new int[queries.length];
        //회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 
        map = new int[110][110];
        int idx = 1;
        map[0][0] = 0;
        for(int i=1; i<=rows; i++){
            for(int j=1; j<=columns; j++){
                map[i][j] = idx++; 
            }
        }
        
        for(int i=0; i<queries.length; i++){
            int num = turnRight(queries[i][0], queries[i][1], queries[i][2], queries[i][3]);
            answer[i] = num;
        }
        
        return answer;
    }
    
    public int turnRight(int r1, int c1, int r2, int c2){
        int temp = map[r1][c1];
        int minNum = temp;
    
        //위로 이동
        for(int i=r1; i<r2; i++){
            minNum = Math.min(minNum, map[i][c1]);
            map[i][c1] = map[i+1][c1];      
        }
        //왼쪽으로 이동
        for(int i=c1; i<c2; i++){
            minNum = Math.min(minNum, map[r2][i]);
            map[r2][i] = map[r2][i+1];
        }
        //아래로 이동
        for(int i=r2; i>r1; i--){
            minNum = Math.min(minNum, map[i][c2]);
            map[i][c2] = map[i-1][c2];
        }
        //오른쪽으로 이동
        for(int i=c2; i>c1; i--){
            minNum = Math.min(minNum, map[r1][i]);
            map[r1][i] = map[r1][i-1];
        }
        
        map[r1][c1+1] = temp;
        
        return minNum;
    }
}