문제 풀이 날짜: 2023.08.09
포스트 작성일: 2023.08.09
* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.
문제 출처
백준 온라인 저지 16935번: 배열 돌리기 3 (골드5)
키워드
구현
풀이 접근법
- 90도 회전의 경우 배열의 가로, 세로 길이가 뒤바뀜에 주의해야 한다.
- 원본 배열 값을 새 배열의 새 위치에 배치하는 식으로 구현하였다.
- 현재 matrix[i][j]를 보고 있다고 할 때, 새 배열의 몇 번 인덱스에 현재 값(matrix[i][j])이 위치해야 하는지 인덱스를 구해준다.
- 이전 배열의 row, col 값이 새 배열의 x, y가 되려면 어떠한 계산을 거쳐야 하는지 방정식(?)을 세우고 반복문을 돌려준다.
- 배열을 네 구역으로 나눠서 값을 옮겨주는 연산은 배열의 mid 값(배열의 가운데 인덱스)을 활용한다.
- 현재 인덱스 i, j 가 mid를 넘었는지 넘지 않았는지를 기준으로 새 인덱스를 다르게 계산한다.
코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static int N;
private static int M;
private static int[][] matrix;
private static int[][] tempMatrix;
public static void main(String[] args) throws NumberFormatException, IOException {
//배열 회전이 더 중요하므로 main 생략
}
private static int[][] flipUpDown() { //1
int N = tempMatrix.length;
int M = tempMatrix[0].length;
int[][] result = new int[N][M];
//col 고정
for(int j = 0; j < M; j++) {
for(int i = 0; i < N / 2; i++) {
result[(N - 1) - i][j] = tempMatrix[i][j];
result[i][j] = tempMatrix[(N - 1) - i][j];
}
}
return result;
}
private static int[][] flipLeftRight() { //2
int N = tempMatrix.length;
int M = tempMatrix[0].length;
int[][] result = new int[N][M];
//row 고정
for(int i = 0; i < N; i++) {
for(int j = 0; j < M / 2; j++) {
result[i][(M - 1) - j] = tempMatrix[i][j];
result[i][j] = tempMatrix[i][(M - 1) - j];
}
}
return result;
}
private static int[][] rotateRight() { //3
int N = tempMatrix.length;
int M = tempMatrix[0].length;
int[][] result = new int[M][N];
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
result[j][(N - 1) - i] = tempMatrix[i][j];
}
}
return result;
}
private static int[][] rotateLeft() { //4
int N = tempMatrix.length;
int M = tempMatrix[0].length;
int[][] result = new int[M][N];
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
result[(M - 1) - j][i] = tempMatrix[i][j];
}
}
return result;
}
private static int[][] rotateClockwise() { //5
int N = tempMatrix.length;
int M = tempMatrix[0].length;
int[][] result = new int[N][M];
int rMid = (N / 2) - 1;
int cMid = (M / 2) - 1;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(i <= rMid && j <= cMid) { //왼쪽위
result[i][j + (cMid + 1)] = tempMatrix[i][j];
} else if(i <= rMid && j > cMid) { //오른쪽위
result[i + (rMid + 1)][j] = tempMatrix[i][j];
} else if(i > rMid && j > cMid) { //오른쪽아래
result[i][j - (cMid + 1)] = tempMatrix[i][j];
} else { //왼쪽아래
result[i - (rMid + 1)][j] = tempMatrix[i][j];
}
}
}
return result;
}
private static int[][] rotateCounterclockwise() { //6
int N = tempMatrix.length;
int M = tempMatrix[0].length;
int[][] result = new int[N][M];
int rMid = (N / 2) - 1;
int cMid = (M / 2) - 1;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(i <= rMid && j <= cMid) { //왼쪽위
result[i + (rMid + 1)][j] = tempMatrix[i][j];
} else if(i <= rMid && j > cMid) { //오른쪽위
result[i][j - (cMid + 1)] = tempMatrix[i][j];
} else if(i > rMid && j > cMid) { //오른쪽아래
result[i - (rMid + 1)][j] = tempMatrix[i][j];
} else { //왼쪽아래
result[i][j + (cMid + 1)] = tempMatrix[i][j];
}
}
}
return result;
}
}
배열 돌리기 문제는 대부분 배열의 새 인덱스 계산이 핵심이다. 달팽이 문제처럼 배열값이 재배치되는 방향이 지속적으로 바뀌지 아닌 이상 고정된 식으로 반복문을 돌려서 답을 구할 수 있을 것이다.
git 링크
(git 링크 첨부)
'Study > Problem Solving' 카테고리의 다른 글
[백준 / Java] 6987번: 월드컵 (골드4) (0) | 2023.08.16 |
---|---|
[백준 / Java] 11286번: 절댓값 힙 (실버1) (0) | 2023.08.09 |
[백준 / Java] 1168번: 요세푸스 문제 2 (플래티넘 3) (0) | 2023.08.08 |
[백준 / Java] 2493번: 탑 (골드5) (0) | 2023.08.07 |
[백준 / Java] 2023번: 신기한 소수 (골드5) (0) | 2023.08.03 |