[백준] 16926. 배열 돌리기 1

유네스코d·2023년 3월 4일

Algorithm Problem

목록 보기
3/4

https://www.acmicpc.net/problem/16926

문제 설명

크기가 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]
   ↓         ↓                   ↑         ↑
A[3][1]   A[3][2] → A[3][3] → A[3][4]   A[3][5]
   ↓                                       ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]

예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.

1 2 3 4       2 3 4 8       3 4 8 6
5 6 7 8       1 7 7 6       2 7 8 2
9 8 7 6   →   5 6 8 2   →   1 7 6 3
5 4 3 2       9 5 4 3       5 9 5 4
 <시작>         <회전1>        <회전2>

배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.


풀이

  • rotate 함수에 배열을 전체적으로 한 번 돌리는 코드를 4방을 이용하여 구현하였다.
  • 배열의 제일 바깥줄부터 안쪽까지 따로따로 돌려줘야 하기 때문에 회전해줘야 하는 직사각형? 개수를 세어 각각 돌려줬다.
    • 각 직사각형의 출발점은 map[i][i]가 될 것이다.
    • 정사각형이 아니라 직사각형 배열이기 때문에
      돌려줘야 하는 횟수는 Math.min(N, M) / 2가 된다.
  • 4방을 하, 우, 상, 좌로 선언하여 이 순서대로 이동하며 값을 바꿔준다.
    값을 바꾸기 전에, 내가 이동할 위치에 있던 값을 cur에 저장해두고
    이전 값인 prev를 해당 자리에 넣어주면서 갱신했다.
    값을 바꿔줬으니 이후 prev = cur로 바꾼다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_S1_16926_배열돌리기1 {

	static int N, M, R;
	static int[][] map;
	static int[] dr = { 1, 0, -1, 0 };  // 하 우 상 좌
	static int[] dc = { 0, 1, 0, -1 };
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		map = new int[N][M];
		
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		for (int i = 0; i < R; i++) {
			rotate();
		}
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}

	}

	private static void rotate() {
		int x = Math.min(N, M);
		
		for (int i = 0; i < x/2; i++) {
			int r = i;
			int c = i;
			int d = 0;
			
			int cur = 0;
			int prev = map[i][i];
			while(d<4) {
				int nr = r + dr[d];
				int nc = c + dc[d];
				
				if(!(nr>=0+i && nc>=0+i && nr<N-i && nc<M-i)) {
					d++;
					continue;
				}
				
				cur = map[nr][nc];
				map[nr][nc] = prev;
				prev = cur;
				r = nr;
				c = nc;
			}	
		}
	}

}
profile
yune's coding

0개의 댓글