문제
https://programmers.co.kr/learn/courses/30/lessons/77485
풀이
단순 구현문제인데 너무 어렵게 생각했던 것 같다.
시계 방향으로 돌면서 이전 값을 현재 값으로 갱신해주는 것을 반복하면 된다.
현재 값을 갱신할 때 최소값 비교를 통해 최소값 또한 갱신한다.
소스코드
import java.util.*;
class Solution {
public int[][] map;
public ArrayList<Integer> answer;
public int[] solution(int rows, int columns, int[][] queries) {
answer = new ArrayList<Integer>();
// 맵 초기화
map = new int[rows+1][columns+1];
int num = 1;
for(int i = 1; i <= rows; i++){
for(int j = 1; j <= columns; j++){
map[i][j] = num;
num++;
}
}
for(int i = 0; i < queries.length; i++){
answer.add(rotate(queries[i]));
}
return answer.stream().mapToInt(x->x).toArray();
}
public int rotate(int[] query){
int sX = query[0];
int sY = query[1];
int eX = query[2];
int eY = query[3];
// 블록 한 개는 겹치므로 마지막 턴에서 갱신하도록 제외
int prev = map[sX][sY];
int min = prev;
// 오른쪽으로~
for(int i = sY+1; i <= eY; i++){
int temp = map[sX][i];
map[sX][i] = prev;
min = Math.min(prev, min);
prev = temp;
}
// 아래로~
for(int i = sX+1; i <= eX; i++){
int temp = map[i][eY];
map[i][eY] = prev;
min = Math.min(prev, min);
prev = temp;
}
// 왼쪽으로~
for(int i = eY-1; i >= sY; i--){
int temp = map[eX][i];
map[eX][i] = prev;
min = Math.min(prev, min);
prev = temp;
}
// 위로~
for(int i = eX-1; i >= sX; i--){
int temp = map[i][sY];
map[i][sY] = prev;
min = Math.min(prev, min);
prev = temp;
}
return min;
}
}
'💡Problem Solving > Programmers' 카테고리의 다른 글
[프로그래머스] 순위 (Java) (0) | 2021.11.28 |
---|---|
[프로그래머스] 호텔 방 배정 (Java) (0) | 2021.11.28 |
[프로그래머스] 압축 (Java) (0) | 2021.11.24 |
[프로그래머스] 쿼드 압축 후 개수 세기 (Java) (0) | 2021.11.23 |
[프로그래머스] 방금그곡 (Java) (0) | 2021.11.23 |