https://school.programmers.co.kr/learn/courses/30/lessons/77485
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이 순서
- 배열 초기화 (초기 Board 1~ n*n)
- 취향상 0기반 index로 계산
- 회전시키며 최소값 갱신하여 반환
- 결국 우리가 변경해야할 행렬의 테두리의 방향은 ( →, ↓, ←, ↑ ) 4방향이다.
방향 순서는 취향에 맡깁니다. - 경계값에 닿으면 방향을 변경해 다시 탐색하는 방식
- 이전 좌표의 정보를 현재 좌표에 덮어씌운다. (이전 좌표의 정보는 현재 좌표 Value로 갱신)
- 결국 우리가 변경해야할 행렬의 테두리의 방향은 ( →, ↓, ←, ↑ ) 4방향이다.
class Solution {
private int[][] DIRECTION = {
{0, 1}, // 우
{1, 0}, // 하
{0, -1}, // 좌
{-1, 0} // 상
};
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int[][] board = makeBoard(rows, columns);
for (int i = 0; i < queries.length; i++) {
int x1 = queries[i][0] - 1; // 0-Index 기반 변경
int y1 = queries[i][1] - 1;
int x2 = queries[i][2] - 1;
int y2 = queries[i][3] - 1;
answer[i] = rotate(board, x1, y1, x2, y2);
}
return answer;
}
private int rotate(int[][] board, int x1, int y1, int x2, int y2) {
int tmp = board[x1][y1];
int minValue = tmp;
int x = x1, y = y1;
for (int i = 0; i < DIRECTION.length; i++) {
while (true) {
int nx = x + DIRECTION[i][0];
int ny = y + DIRECTION[i][1];
if (nx < x1 || nx > x2 || ny < y1 || ny > y2) {
break;
}
// 값 변경
int v = board[nx][ny];
board[nx][ny] = tmp;
tmp = v;
if (tmp < minValue) {
minValue = tmp;
}
x = nx;
y = ny;
}
}
return minValue;
}
private int[][] makeBoard(int rows, int columns) {
int[][] board = new int[rows][columns];
int value = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
board[i][j] = value++;
}
}
return board;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스][JAVA] Lv.2 / 서버 증설 횟수 (0) | 2025.02.23 |
|---|