1. 문제
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. 결과
'코딩테스트 > PROGRAMMERS' 카테고리의 다른 글
[Programmers] N으로 표현 - JAVA (0) | 2023.05.15 |
---|---|
[Programmers] 멀쩡한 사각형 - JAVA (0) | 2023.05.13 |
[Programmers] 최소 직사각형 - JAVA (0) | 2023.05.09 |
[PG] 구명보트 - JAVA (0) | 2023.02.06 |
[PG] 개인정보 수집 유효기간 - JAVA (0) | 2023.01.08 |
댓글