문제 풀이 날짜: 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 링크 첨부)

+ Recent posts