https://www.acmicpc.net/problem

 

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

 

 

문제 분석

- 기존 배열 돌리기 1에서 돌리는 횟수의 크기가 커졌다. 

- 모듈러 연산을 통해서 돌리는 횟수를 최소화시킨 다음 구현한다.

- 기존에 돌려야하는 횟수(R)의 반복문을 rotate메소드 안으로 가져와 깊이만큼 처리하고 해당 깊이에 맞게 회전시킨다.

- 그 외 코드는 기존 배열 돌리기 1과 동일

 

 

문제 풀이

1) 배열을 입력받는다.

2) 배열의 깊이를 확인하여 깊이만큼 회전시킨다. (배열의 깊이는 아래 그림과 같이 빨간색 한 번, 파란색 한 번이다)

(따라서 int depth = Math.min(N, M) / 2;코드를 통해 깊이를 측정한다)

3) rotate메소드를 통해 깊이만큼 회전시킨다.

4) 해당 깊이에서 모듈러 연산을 통해 몇 번 회전시킬지 정하고( int mod = R % ((N + M - 4 * j) * 2 - 4); ) 해당 횟수만큼 회전시킨다.

5) 그 외는 배열 돌리기 1과 동일하다.

 

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;

		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 j = 0; j < depth; j++) { // 한 줄 종료 후 배열의 깊이만큼 반복 for문
			int mod = R % ((N + M - 4 * j) * 2 - 4);  // 깊게 들어갈 수록  8만큼 도는 횟수를 줄여야 한 바퀴를 돌게 된다. (따라서 4*j *2를 해줘서 처리한다)
			// 회전 횟수만큼 회전시키기
			while (mod-- != 0) { // 여기서 mod--가 0이 된다면 한 줄에서 돌아야되는 다 돌았다는 것.

				int sr = j; // 이동하는 시작 r 좌표
				int sc = j; // 이동하는 시작 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 (j <= nr && j <= nc && nr < N - j && nc < M - j) { // 배열 범위 안에 있을 때
						map[sr][sc] = map[nr][nc];
						sr = nr;
						sc = nc;
					} else { // 배열 범위 벗어나면 방향 바꾸기
						dir++;
					}
				} // 4방향 이동 완료

				map[j + 1][j] = startTemp;

			}
		} // 한줄 이동 완료
	}// rotate 함수 종료

}// class 종료

 

'Algorithm > BOJ' 카테고리의 다른 글

BOJ 14503 로봇 청소기  (0) 2021.06.18
BOJ 16935 배열 돌리기 3  (0) 2021.06.11
BOJ 13335 트럭  (0) 2021.06.08
BOJ 16926 배열 돌리기 1  (0) 2021.06.08
BOJ 1932 정수 삼각형  (0) 2021.04.07