[프로그래머스/Java] 행렬 테두리 회전하기 Lv.2
2023. 12. 2. 01:02ㆍ알고리즘/구현
728x90
반응형
문제
풀이
단순 구현을 해도 풀리는 문제였다.
- 주어지는 행, 열 크기에 맞춰 board를 만들어주고
- queries의 (x1, y1, x2, y2) 좌표에 맞게 시계방향으로 값을 swap해준다.
- 이때 각 query별 값의 최솟값을 찾는다.
코드
import java.util.*;
class Solution {
int[][] board;
public int[] solution(int rows, int columns, int[][] queries) {
setBoard(rows, columns);
int index = 0;
int[] answer = new int[queries.length];
for (int[] query : queries) {
int x1 = query[0] - 1;
int y1 = query[1] - 1;
int x2 = query[2] - 1;
int y2 = query[3] - 1;
int min = spin(x1, y1, x2, y2);
answer[index++] = min;
}
return answer;
}
private void setBoard(int rows, int columns) {
board = new int[rows][columns];
int num = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
board[i][j] = num++;
}
}
}
private int spin(int x1, int y1, int x2, int y2) {
int cx = x1;
int cy = y1;
int pre = board[cx][cy];
int min = pre;
//(x1, y1) -> (x1, y2)
while (cy < y2) {
int temp = board[cx][cy + 1];
board[cx][cy + 1] = pre;
pre = temp;
min = Math.min(min, pre);
cy++;
}
//(x1, y2) -> (x2, y2)
while (cx < x2) {
int temp = board[cx + 1][cy];
board[cx + 1][cy] = pre;
pre = temp;
min = Math.min(min, pre);
cx++;
}
//(x2, y2) -> (x2, y1)
while (cy > y1) {
int temp = board[cx][cy - 1];
board[cx][cy - 1] = pre;
pre = temp;
min = Math.min(min, pre);
cy--;
}
//(x2, y1) -> (x1, y1)
while (cx > x1) {
int temp = board[cx - 1][cy];
board[cx - 1][cy] = pre;
pre = temp;
min = Math.min(min, pre);
cx--;
}
return min;
}
}
728x90
반응형
'알고리즘 > 구현' 카테고리의 다른 글
[백준/C++] 4889번 안정적인 문자열 (0) | 2021.03.24 |
---|---|
[백준/C++] 10799번 쇠막대기 (0) | 2021.03.23 |
[백준/C++] 2504번 괄호의 값 (0) | 2021.03.23 |
[백준/C++] 5430번 AC (0) | 2021.03.22 |
[백준/C++] 18258번 큐 2 (0) | 2021.03.21 |