Algorithm/BOJ

BOJ 16926 배열 돌리기 1

wow 2021. 6. 8. 22:53

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

 

 

문제 분석

- 배열을 돌리는 메소드를 만들어서 돌리는 횟수만큼 메소드를 호출한다.

- 배열의 깊이만큼 회전시킨다 (가로/세로 중 더 작은 값을 2로 나눈 값(깊이)만큼 반시계방향으로 회전시켜야한다)

- 우->좌 (제일 윗줄) / 하->상 (제일 오른쪽줄) /  좌->우 (제일 아랫줄) / 상->하 (제일 왼쪽줄)의 4방향만큼 반시계방향으로 이동시킨다.

 

 

문제 풀이

1) 배열을 입력받는다.

2) 입력받은 회전 횟수만큼 회전한다.

3) 배열의 깊이만큼 회전한다.

3-1) 우/하/좌/상의 방향으로 회전시킨다.

3-2) 각 방향을 회전시킬 때 배열의 범위를 벗어나면 방향을 변경해준다.

 

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

public class Main {

	private static int N, M, R;
	private static int[] dr = { 0, 1, 0, -1 }; // 우 하 좌 상
	private static int[] dc = { 1, 0, -1, 0 };
	private static int[][] map;

	// main 함수
	public static void main(String[] args) throws NumberFormatException, IOException {
		input();
	}// main 함수 종료

	// input 함수
	private static void input() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken()); // 세로 R
		M = Integer.parseInt(st.nextToken()); // 가로 C
		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());
			}
		}

		int depth = Math.min(N, M) / 2;
		// 회전 횟수만큼 회전시키기
		for (int i = 0; i < R; i++) {
			rotate(depth);
		}

		// 출력
		for (int i = 0; i < N; i++) {
			for(int j=0;j<M;j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}

	}// input 함수 종료

	private static void rotate(int depth) {

		for (int i = 0; i < depth; i++) { // 한 줄 종료 후 배열의 깊이만큼 반복 for문
			
			int sr = i; // 이동하는 시작 r 좌표
			int sc = i; // 이동하는 시작 c 좌표
			int dir = 0; // 4 방향을 나타냄
			int startTemp = map[sr][sc]; // 시작 좌표 값 임시 저장

			while (dir < 4) { // 4방향 이동시킴

				int nr = sr + dr[dir];
				int nc = sc + dc[dir];

				if (i <= nr && i <= nc && nr < N - i && nc < M - i) { // 배열 범위 안에 있을 때
					map[sr][sc] = map[nr][nc];
					sr = nr;
					sc = nc;
				} else { // 배열 범위 벗어나면 방향 바꾸기
					dir++;
				}
			} // 4방향 이동 완료
	
			map[i + 1][i] = startTemp;
	
		} // 한줄 이동 완료

	}// rotate 함수 종료

}// class 종료