본문 바로가기

[Algorithms]/[Problems]

BOJ. 16927번. 배열 돌리기 2

728x90

 

1번에 비해 달라진 점은, 일정 횟수 이상 회전이 반복되면 처음과 동일해지므로, 그에 대한 처리를 해주면 된다.

www.acmicpc.net/problem/16927

 

16927번: 배열 돌리기 2

크기가 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

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	
	static int N, M, rotate;
	static int map[][];
	
	private static void dataInput() throws IOException {
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		rotate = 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());
			}
		}
	}
	private static void rotatePeel(int y, int x, int H, int W) { // 회전 시작점, 세로, 가로 길이
		int start = map[y][x];
		// 상
		for(int p=x; p<x+W-1; p++) {
			map[y][p]=map[y][p+1];
		}
		// 우
		for(int p=y; p<y+H-1; p++) {
			map[p][x+W-1]=map[p+1][x+W-1];
		}
		// 하
		for(int p=x+W-1; p>x; p--) {
			map[y+H-1][p]=map[y+H-1][p-1];
		}
		// 좌
		for(int p=y+H-1; p>=y+1; p--) {
			map[p][x]=map[p-1][x];
		}
		map[y+1][x]=start;
	}
	
	private static void rotateMatrixEvenN(int n,int min_side) {
		int backtToOrigin = (N+M)*2-4; // backToOrigin 추가
		int cnt = 0;
		while(cnt<min_side/2) {
			for(int i=0; i<(n%backtToOrigin); i++) {
				rotatePeel(cnt,cnt,N-2*cnt,M-2*cnt);
			}
			backtToOrigin-=8;
			cnt++;
		}
	}
	
	public static void main(String[] args) throws IOException {
		
		dataInput();		
//		rotatePeel(0,0,N,M);
		
		rotateMatrixEvenN(rotate, Math.min(N, M));

		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				sb.append(map[i][j]+" ");
			}
			sb.append("\n");
		}
		bw.write(sb.toString());
		
		bw.flush();
		bw.close();
		br.close();
	}

}
728x90

'[Algorithms] > [Problems]' 카테고리의 다른 글

BOJ. 17406번. 배열 돌리기 4  (0) 2021.02.14
BOJ. 16935번. 배열 돌리기 3  (0) 2021.02.14
BOJ. 16926번. 배열 돌리기 1  (0) 2021.02.14
BOJ. 10799번. 쇠막대기  (0) 2021.02.14
BOJ. 2615번. 오목  (0) 2021.02.04