본문 바로가기
백준

백준 16926. 배열 돌리기1

by 29살아저씨 2021. 8. 20.
반응형

🅰 백준 16926. 배열 돌리기1

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

✏️ 문제 풀이

  • 먼저 배열이 주어졌을 때 돌려야 하는 배열의 개수를 구하는 것이 중요했다.
  • 가로와 세로 중 최소값 / 2만큼 배열을 회전 시켜야한다.
  • rotate함수를 이용하여 4가지 방향으로 회전을 시켜주었다.

✏️ 소스코드

package _0811;

import java.util.Scanner;

public class Main_실버3_16926_손은성 {
	public static int arr2[][];
	static int N, M, R,N1,M1;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
		N1 = N;
		M = sc.nextInt();
		M1 = M;
		R = sc.nextInt();

		arr2 = new int[N + 1][M + 1];

		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= M; j++) {
				arr2[i][j] = sc.nextInt();
			}
		}
		int r = Math.min(N, M) / 2; // 돌려야 하는 배열의 개수
		rotate(r);
		
		for (int i = 1; i <= N1; i++) {
			for (int j = 1; j <= M1; j++) {
				System.out.print(arr2[i][j] + " ");
			}
			System.out.println();
		}
	}
	static void rotate(int r) {
		for (int t = 0; t < R; t++) { // R만큼 회전
			for (int n = 1; n <= r; n++) {  // 돌려야 하는 배열의 개수만큼 한번씩 회전
				int temp = arr2[n][n];
				for (int i = n; i < M; i++) {   // (n,M -> n,n) 열 -1 이동
					arr2[n][i] = arr2[n][i + 1];
				}
				for (int i = n; i < N; i++) {   // (N,M -> 1,M) 행 -1 이동
					arr2[i][M] = arr2[i + 1][M];
				}
				for (int i = M; i > n; i--) {   // (N,1 -> N,M) 열 +1 이동
					arr2[N][i] = arr2[N][i - 1];
				}
				for (int i = N; i > n + 1; i--) {   // (1,1 -> N,1) 행 +1 이동
					arr2[i][n] = arr2[i - 1][n];
				}
				arr2[n + 1][n] = temp;		// 시작점은 1씩 더해지고 끝나는 지점은 1씩 마이너스
				N -= 1;
				M -= 1;
			}
			N = N1;							// 배열 전체 회전 후 원상복귀
			M = M1;
		}
	}
}

 

✅ 후기

  • 생각보다 어려운 문제였다. 다음에는 다양한 방식으로 풀 수 있도록 해야겠다.
반응형

'백준' 카테고리의 다른 글

백준 2563. 색종이  (0) 2021.08.20
백준 1987. 알파벳  (0) 2021.08.20
백준 3109. 빵집  (0) 2021.08.20
백준 15686. 치킨배달  (0) 2021.08.13
백준 1080. 행렬  (0) 2021.08.13

댓글