🧫 문제 분석
✔️ 출처
📖 문제



현재 좌표에서 이동하는 문제다.
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;
}
}

❗ 오답노트 / 필요한 지식
- 단순 좌표 이동 문제
'programmers > Lv 2' 카테고리의 다른 글
디펜스 게임 [자바] (1) | 2025.02.11 |
---|---|
테이블 해시 함수 [자바] (0) | 2025.02.11 |
다리를 지나는 트럭 [자바] (0) | 2025.02.04 |
숫자 카드 나누기 [자바] (1) | 2025.02.01 |
호텔 대실 [자바] (1) | 2025.02.01 |