728x90
문제
풀이
구현 문제
내 풀이
- 회전시켜야 할 위치(y,x)와 회전시키기 전 그 위치의 값을 순서대로 리스트에 저장
- 저장한 리스트에 있는 값을 새로운 배열에 한 칸 씩 오른쪽으로 밀어서 저장
- 한 칸 씩 밀어서 만든 배열의 값을 회전시키야 할 위치(y,x)에 맨 앞부터 순서대로 넣음
어려웠던 점
c++에는 배열을 한 칸씩 미는 rotate() 함수가 있는데, 자바에서는 그게 없어서 직접 구현해야 해서 번거로웠다.
코드
내 코드 (맘에 안 듬)
import java.util.*;
class Solution {
static int[] dy = {0, 1, 0, -1}; // 우 하 좌 상
static int[] dx = {1, 0, -1, 0};
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int[][] a = new int[rows][columns];
int n = 1;
for (int i = 0; i < rows; i++)
for (int j = 0; j < columns; j++)
a[i][j] = n++;
int c = 0;
for (int[] cur : queries) {
int y1 = cur[0], x1 = cur[1], y2 = cur[2], x2 = cur[3];
y1--; x1--; y2--; x2--;
ArrayList<int[]> index_list = new ArrayList<>();
ArrayList<Integer> num = new ArrayList<>();
index_list.add(new int[]{y1, x1});
num.add(a[y1][x1]);
int y = y1, x = x1;
int d = 0;
while(d < 4) {
if (d == 0) {
int cnt = 0;
while(cnt < x2 - x1) {
y += dy[d];
x += dx[d];
index_list.add(new int[]{y, x});
num.add(a[y][x]);
cnt++;
}
} else if (d == 1) {
int cnt = 0;
while(cnt < y2 - y1) {
y += dy[d];
x += dx[d];
index_list.add(new int[]{y, x});
num.add(a[y][x]);
cnt++;
}
} else if (d == 2) {
int cnt = 0;
while(cnt < x2 - x1) {
y += dy[d];
x += dx[d];
index_list.add(new int[]{y, x});
num.add(a[y][x]);
cnt++;
}
} else {
int cnt = 0;
while(cnt < y2 - y1 - 1) {
y += dy[d];
x += dx[d];
index_list.add(new int[]{y, x});
num.add(a[y][x]);
cnt++;
}
}
d++;
}
int mn = num.get(num.size() - 1);
int[] change_num = new int[num.size()];
change_num[0] = num.get(num.size() - 1);
for (int i = 0; i < num.size() - 1; i++) {
change_num[i + 1] = num.get(i);
mn = Math.min(num.get(i), mn);
}
int i = 0;
for (int[] idx : index_list)
a[idx[0]][idx[1]] = change_num[i++];
answer[c++] = mn;
}
return answer;
}
}
더 나은 풀이 (프로그래머스 다른 사람의 풀이 참고)
import java.util.*;
class Solution {
int[][] matrix;
public int[] solution(int rows, int columns, int[][] queries) {
matrix = new int[rows][columns];
int[] answer = new int[queries.length];
for(int i = 0; i < rows; i++)
for(int j = 0; j < columns; j++)
matrix[i][j] = i * columns + j + 1;
for(int i = 0; i < queries.length; i++) // 회전하고 최솟값 answer에 저장
answer[i] = rotate(queries[i]);
return answer;
}
public int rotate(int[] query){
int y1 = query[0] - 1;
int x1 = query[1] - 1;
int y2 = query[2] - 1;
int x2 = query[3] - 1;
int temp = matrix[y1][x1];
int min = temp;
for(int i = y1; i < y2; i++){ // 위로 이동
matrix[i][x1] = matrix[i+1][x1];
if(min > matrix[i][x1]) min = matrix[i][x1];
}
for(int i = x1; i < x2; i++){ // 좌측 이동
matrix[y2][i] = matrix[y2][i+1];
if(min > matrix[y2][i]) min = matrix[y2][i];
}
for(int i = y2; i > y1; i--){ // 아래 이동
matrix[i][x2] = matrix[i-1][x2];
if(min > matrix[i][x2]) min = matrix[i][x2];
}
for(int i = x2; i > x1; i--){ // 우측 이동
matrix[y1][i] = matrix[y1][i-1];
if(min > matrix[y1][i]) min = matrix[y1][i];
}
matrix[y1][x1+1] = temp; // 임시저장한 값 저장
return min;
}
}
'프로그래머스' 카테고리의 다른 글
프로그래머스 lv2 - 구명보트 (자바) (0) | 2024.06.22 |
---|---|
프로그래머스 lv2 - 요격 시스템 (자바) (0) | 2024.06.22 |
프로그래머스 lv2 - k진수에서 소수 개수 구하기 (자바) [2022 KAKAO BLIND RECRUITMENT] (0) | 2024.06.19 |
프로그래머스 lv2 - 게임 맵 최단거리 (자바) (0) | 2024.06.19 |
프로그래머스 lv2 - 방문 길이 (자바) (0) | 2024.06.18 |