코딩테스트/PROGRAMMERS

[Programmers] 행렬 테두리 회전하기 - JAVA

5월._. 2023. 5. 12.
728x90

1. 문제

 

프로그래머스

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

programmers.co.kr

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

 

행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.


2. 풀이

Solution

1.  board에 1부터 차례대로 저장한다.

2.  queries길이만큼의 int 배열을 만들어서, 한 번 회전할 때마다 가장 작은 값을 저장한다.

3.  answer를 반환한다.

int[][] board;
int[][] deltas = {{0,1},{1,0},{0,-1},{-1,0}};
public int[] solution(int rows, int columns, int[][] queries) {
    board = new int[rows+1][columns+1];
    for(int i=1, num = 1;i<=rows;i++){
        for(int j=1;j<=columns;j++){
            board[i][j] = num++;
        }
    }
        
    int[] answer = new int[queries.length];
    for(int i=0;i<answer.length;i++){
        answer[i] = rotate(queries[i]);
    }
        
    return answer;
}

 

회전

회전한 후 가장 작은 값을 반환하는 메서드다.

1.  이전 값을 prev, 이전 위치를 x,y에 저장하면서 움직인다. prev의 초기값은 board[x][y]다.

2.  deltas에 저장해 둔 방향으로 움직인다. 가로-세로-가로-세로 시계 방향이다. 가로 방향으로 움직일 때는 y값의 차이만큼 움직이고, 세로 방향으로 움직일 때는 x값의 차이만큼 움직인다. 여기선 x=세로(행), y=가로(열)이기 때문이다.

3.  x,y값을 변경한 뒤에 board[x][y]와 prev값을 서로 교환한다.

4.  교환한 prev는 min 과의 비교 후 더 작은 값을 min에 저장한다.

5.  회전이 끝난 뒤 min을 반환한다.

public int rotate(int[] query){
    int x = query[0];
    int y = query[1];
    int prev = board[x][y];
    int min = prev;
        
    int gap,tmp;
    for(int d=0;d<4;d++){
        gap = d%2==0?query[3]-query[1]:query[2]-query[0];
        for(int i=0;i<gap;i++){
            x += deltas[d][0];
            y += deltas[d][1];
                
            tmp = prev;
            prev = board[x][y];
            board[x][y] = tmp;
                
            min = Math.min(min,prev);
        }
    }
        
    return min;
}

 

전체 코드

import java.util.*;

class Solution {
    int[][] board;
    int[][] deltas = {{0,1},{1,0},{0,-1},{-1,0}};
    public int[] solution(int rows, int columns, int[][] queries) {
        board = new int[rows+1][columns+1];
        for(int i=1, num = 1;i<=rows;i++){
            for(int j=1;j<=columns;j++){
                board[i][j] = num++;
            }
        }
        
        int[] answer = new int[queries.length];
        for(int i=0;i<answer.length;i++){
            answer[i] = rotate(queries[i]);
        }
        
        return answer;
    }
    
    public int rotate(int[] query){
        int x = query[0];
        int y = query[1];
        int prev = board[x][y];
        int min = prev;
        
        int gap,tmp;
        for(int d=0;d<4;d++){
            gap = d%2==0?query[3]-query[1]:query[2]-query[0];
            for(int i=0;i<gap;i++){
                x += deltas[d][0];
                y += deltas[d][1];
                
                tmp = prev;
                prev = board[x][y];
                board[x][y] = tmp;
                
                min = Math.min(min,prev);
            }
        }
        
        return min;
    }
}

3. 결과

댓글