본문 바로가기

ALGORITHM

백준 16926 배열 돌리기 1 (Java)

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. 문제 및 입출력예제

 

3. 문제 풀이

입력을 다 받고 나서 어떻게 구현해야 할지 고민했다.

일단 방향을 바꾸면서 돌아야 하니까 방향벡터를 사용하기로 했다.

 

주어진 예제를 통해 회전은 N과 M 중 작은 숫자의 반만큼 돈다는 사실을 알 수 있다.

회전은 한 겹씩 하기 때문에 반복문을 0부터 시작해서 회전 횟수만큼 돌렸다.

 

돌리는  과정에서 시작과 끝을 따로 변수로 만들지 않고, 반복문의 인덱스를 활용했다.

 

회전의 시작은 항상 같은 수(1, 1)이나 (2, 2) 처럼 같은 숫자일 경우였다.

해당 숫자를 미리 빼놓고 돌리는 과정을 진행하고, 빼놓은 숫자만 추가하면 된다.

 

한 겹의 회전을 한 후에는 안쪽으로 들어가 같은 과정을 반복하면 된다.

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	private static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] nmr = br.readLine().split(" ");
		int N = Integer.parseInt(nmr[0]);
		int M = Integer.parseInt(nmr[1]);
		int R = Integer.parseInt(nmr[2]);
		int round = Math.min(N, M)/2;
		
		int[][] map = new int[N][M];
		for(int i=0;i<N;i++) {
			String[] split = br.readLine().split(" ");
			for(int j=0;j<M;j++) {
				map[i][j] = Integer.parseInt(split[j]);
			}
		}
		
		int[] dx = {0, 1, 0, -1};
		int[] dy = {1, 0, -1, 0};

		for(int t=0;t<R;t++) {
			for(int i=0;i<round;i++) {
				int cnt = 0;
				int now = map[i][i];
				int x = i, y = i;
				while(cnt<4) {
					int X = x +dx[cnt];
					int Y = y +dy[cnt];
					
					if(X>=i && Y>=i && X<N-i && Y<M-i ) {
						map[x][y] = map[X][Y];
						x = X;
						y = Y;
					}
					else {
						cnt++;
					}
				}
				map[i+1][i] = now;
			}
		}

		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				sb.append(map[i][j]+" ");
			}
			sb.append("\n");
		}
		
		System.out.println(sb);
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 23971 ZOAC 4 (Java)  (0) 2023.02.24
백준 16935 배열 돌리기 3 (Java)  (0) 2023.02.23
백준 13458 시험 감독 (Java)  (0) 2023.02.22
백준 1991 트리 순회 (Java)  (0) 2023.02.21
백준 1158 요세푸스 문제 (Java)  (0) 2023.02.20