참고
문제해설
문제 로직고민
NOTE
•
가장 단순하게 배열을 회전시키고, 회전시킨 요소들중 최소값을 반환하는 함수를 작성했다.
◦
배열 회전의 경우 for문을 복잡하게 작성했는데 이를 최적화하는 요소를 재귀로 풀려다 시간문제로 그만뒀다.
작성코드
NOTE
import java.util.*;
class Solution {
int[][] map;
int rows;
int columns;
public int[] solution(int rows, int columns, int[][] queries) {
this.map = new int[rows+1][columns+1];
this.rows = rows;
this.columns = columns;
// 1. map 초기화
int val = 1;
for(int i =1; i<=rows; i++){
for(int j=1; j<=columns; j++){
map[i][j] = val++;
}
}
// 2. 쿼리값 회전
int[] answer = new int[queries.length];
int idx = 0;
for(int[] query : queries){
answer[idx++] = rotate(query[0], query[1], query[2], query[3]);
}
return answer;
}
private int rotate(int sy, int sx, int dy, int dx){
int min = Integer.MAX_VALUE;
int prev = map[sy+1][sx];
int current = 0;
// 2. 오른쪽 방향
for(int i=sx; i<=dx; i++){
current = map[sy][i];
map[sy][i] = prev;
prev = current;
min = Math.min(min, prev);
}
// 3. 아래 방향
for(int i=sy+1; i<=dy; i++){
current = map[i][dx];
map[i][dx] = prev;
prev = current;
min = Math.min(min, prev);
}
// 4. 왼쪽 방향
for(int i=dx-1; i>=sx; i--){
current = map[dy][i];
map[dy][i] = prev;
prev = current;
min = Math.min(min, prev);
}
// 5. 위 방향 체크
for(int i=dy-1; i>sy; i--){
current = map[i][sx];
map[i][sx] = prev;
prev = current;
min = Math.min(min, prev);
}
return min;
}
}
Java
복사
다른사람 풀이
NOTE
class Solution {
static int map[][];
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
map=new int[rows+1][columns+1];
int idx=1;
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++){
answer[i]=rotate(queries[i][0],queries[i][1],queries[i][2],queries[i][3]);
}
return answer;
}static int rotate(int x1,int y1,int x2,int y2){
int x=x1;
int y=y1;
int[]dx={0,-1,0,1};
int[]dy={1,0,-1,0};
int dir=3;
int temp=map[x][y];
int min=temp;
while(true){
if(x==x2&&y==y1){
dir=0;
}
if(x==x2&&y==y2)dir=1;
if(x==x1&&y==y2)dir=2;
map[x][y]=map[x+dx[dir]][y+dy[dir]];
x+=dx[dir];
y+=dy[dir];
min=Math.min(map[x][y],min);
if(x==x1&&y==y1){
map[x1][y1+1]=temp;
break;
}
}
return min;
}
}
Java
복사
dir이라는 변수를 통해 상하좌우 이동을 단순히 while문 하나로 표현한게 인상깊다.