programmers/Lv 2

행렬 테두리 회전하기 [자바]

Meluu_ 2025. 2. 11. 10:42

 

🧫 문제 분석

✔️ 출처

행렬 테두리 회전하기 level 2

📖 문제

 

현재 좌표에서 이동하는 문제다.

1~row*columns 까지 이중 배열에 숫자를 각 넣어주고

 

그래프 탐색처럼, 이동 방향을 정하는 배열을 만든다. 

이동 방향은 시계 방향 즉, 좌 하 우 상 순으로 움직인다.

 

이를 코드로 짜면 아래처럼 된다. 

    // 좌,하,우,상
    int[] dy = {0, 1, 0, -1};
    int[] dx = {1, 0, -1, 0};

 

 방향을 정하고 주어진 queries의 좌표값 만큼 이동하면 된다. 

주의할 점은 문제에서 queries 각 행은 [x1, y1, x2, y2] 로 주어지는데 

x1행 y1열 이다.

 

x2 - x1, y2 - y1 만큼 방향으로 이동하면서 

이전 값을 넣어주고 

기존 값을 따로 저장하는 식으로 시계방향을 돌면서 처리해주면 된다 .

 

돌면서 현재 위치의 값이 최솟값인지 체크하면서 answer 배열을 최신화한다. 

 

 

✔️ 비슷한 문제 포스팅

백준 1022번 : 소용돌이 예쁘게 출력하기 [좌표 이동]

 

 


🔅 문제 풀이

import java.util.*;

class Solution {
    
    // 좌,하,우,상
    int[] dy = {0, 1, 0, -1};
    int[] dx = {1, 0, -1, 0};
    
    public int[] solution(int rows, int columns, int[][] queries) {
        int[][] map = new int[rows + 1][columns + 1];
        
        
        // 1 ~ rows * columns 까지 숫자 채우기
        for (int r = 1; r <= rows; r++) {
            for (int c = 1; c <= columns; c++) {
                map[r][c] = ((r - 1) * columns) + c;
            }
        }
        
        // queries들을 처리
        // 가장 작은 숫자들을 담을 배열
        int[] answer = new int[queries.length];
        
        for (int i = 0; i < queries.length; i++) {
            int y1 = queries[i][0];
            int x1 = queries[i][1];
            int y2 = queries[i][2];
            int x2 = queries[i][3];
            
            int[] current = {y1, x1}; // 현재 위치 
            int preValue = map[y1][x1]; // 회전시 넣을 값
            answer[i] = preValue; // 최솟값 찾기
            
            // 좌 하 우 상으로 움직이기
            for (int j = 0; j < 4; j++) {
                int limit = (j % 2 == 0) ? x2 - x1 : y2 - y1;
                
                for (int k = 0; k < limit; k++) {
                    int newR = current[0] + dy[j];
                    int newC = current[1] + dx[j];
                    
                    int tmp = map[newR][newC]; // 기존 값 빼고
                    map[newR][newC] = preValue; // 이전 값 넣기
                    preValue = tmp;
                    
                    current[0] = newR;
                    current[1] = newC;
                    // 최솟값 넣기
                    answer[i] = Math.min(answer[i], map[newR][newC]);
                }
            }
            
        }
        
        
        return answer;
    }
}

 

❗ 오답노트 / 필요한 지식

  1.  단순 좌표 이동 문제

'programmers > Lv 2' 카테고리의 다른 글

디펜스 게임 [자바]  (1) 2025.02.11
테이블 해시 함수 [자바]  (0) 2025.02.11
다리를 지나는 트럭 [자바]  (0) 2025.02.04
숫자 카드 나누기 [자바]  (1) 2025.02.01
호텔 대실 [자바]  (1) 2025.02.01