[Algorithm/Programmers] 자바 - 전화번호 목록
문제 | 플랫폼 | 난이도 | 유형 | 풀이 링크 | 문제 링크 |
---|
행렬 테두리 회전하기 | Programmers | 2021 Dev-Matching: 웹 백앤드 개발자(상반기) | --- | 풀이 | 문제 |
문제 해석
- r x c 크기의 행렬에1부터 숫자가 적혀있습니다.
- 직사각형 범위를 여러 번 선택합니다.
- 해당 직사각형의 테두리에 해당하는 숫자를
- 시계방향으로 회전합니다.
- 문제에서 주어진 다음 그림과 같은 형태가 될 것입니다.
- rows, columns, queires가 인풋으로 주어지고,
- 각 회전(x1, y1, x2, y2)을 적용한 뒤,
- 회전 후 위치가 바뀐 숫자들 중 가장 작은 숫자를 순서대로 배열에 담아 리턴하라고 합니다.
- 위치가 바뀐 숫자는 자명히 테두리의 숫자일 것입니다.
- 각 회전을 하며 해당 테두리 내의 숫자 중 가장 작은 값만 따로 담으면 될 것 같습니다.
- 회전이 여러 번 진행되므로 회전을 꼭 시행해야 합니다.
- 순서대로 담아야 하니 모든 회전이 끝난 후(배열의 각 회전의 가장 작은 숫자를 담은 후) 오름차순 정렬이 필요할 듯 합니다.
풀이
- 회전을 위해 x1, y1을 임시저장한 뒤,
- 회전할 테두리의 왼쪽 변, 아래 변, 오른쪽 변, 윗 변 순으로 회전시키겠습니다.
- 회전을 하며 회전하는 숫자들의 최솟값을 따로 담아줍니다.
import java.util.*;
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] ans = new int[queries.length];
int[][] map = createMap(rows, columns);
int qLen = queries.length;
for (int i = 0; i < qLen; i++) {
ans[i] = rotate(map, queries[i][0], queries[i][1], queries[i][2], queries[i][3]);
}
return ans;
}
private static int rotate(int[][] map, int x1, int y1, int x2, int y2) {
int temp = map[x1][y1];
int min = temp;
for (int i = x1; i < x2; i++) {
map[i][y1] = map[i + 1][y1];
min = Math.min(min, map[i][y1]);
}
for (int i = y1; i < y2; i++) {
map[x2][i] = map[x2][i + 1];
min = Math.min(min, map[x2][i]);
}
for (int i = x2; i > x1; i--) {
map[i][y2] = map[i - 1][y2];
min = Math.min(min, map[i][y2]);
}
for (int i = y2; i > y1; i--) {
map[x1][i] = map[x1][i - 1];
min = Math.min(min, map[x1][i]);
}
map[x1][y1 + 1] = temp;
return min;
}
private static int[][] createMap(int r, int c) {
int[][] map = new int[r+1][c+1];
int cnt = 1;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
map[i][j] = cnt++;
}
}
return map;
}
}