본문 바로가기
Algorithm/Baekjoon

Baekjoon 16926 배열 돌리기 1 JAVA

by Hunveloper 2022. 2. 9.
728x90
 

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

문제

크기가 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번 회전시킨 결과를 구해보자.

입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.

제한
  • 2 ≤ N, M ≤ 300
  • 1 ≤ R ≤ 1,000
  • min(N, M) mod 2 = 0
  • 1 ≤ Aij ≤ 108
풀이

각각 상, 우, 하, 좌 이 순서대로 원소를 돌리는 방법을 사용하였다.

loc는 왼쪽상단을 기준으로 도는 위치를 지정한다. main에서 N*M, N-2*m-2 이런 순서대로 회전 함수를 호출하고

rotate 함수는 입력되는 loc의 값의 맞게 하나씩 돌린다. 

코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	static int[][] arr;
	static int n, m, r;

	public static void rotate(int loc, int count) {
		int V_mod = 2 * (n - 2 * loc) + 2 * (m - 2 * loc - 2);
		count %= V_mod;

		for (int k = 0; k < count; k++) {
			int save = arr[loc][loc];
			for (int j = loc; j < m - loc - 1; j++) // upside
				arr[loc][j] = arr[loc][j + 1];
			for (int i = loc; i < n - loc - 1; i++) // rightside
				arr[i][m - loc - 1] = arr[i + 1][m - loc - 1];
			for (int j = m - loc - 2; j >= loc; j--) // downside
				arr[n - loc - 1][j + 1] = arr[n - loc - 1][j];
			for (int i = n - loc - 2; i >= loc; i--) // leftside
				arr[i + 1][loc] = arr[i][loc];
			arr[loc + 1][loc] = save;
		}
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		r = Integer.parseInt(st.nextToken());
		arr = new int[n][m];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < m; j++)
				arr[i][j] = Integer.parseInt(st.nextToken());
		}
		for (int i = 0; i < Math.min(n, m) / 2; i++)
			rotate(i, r);

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++)
				bw.write(arr[i][j] + " ");
			bw.write("\n");
		}
		bw.close();
	}
}
728x90
728x90

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

Baekjoon 16935 배열 돌리기 3 JAVA  (0) 2022.02.09
Baekjoon 16927 배열 돌리기 2 JAVA  (0) 2022.02.09
Baekjoon 15657 N과 M (8) JAVA  (0) 2022.02.09
Baekjoon 15656 N과 M (7) JAVA  (0) 2022.02.08
Baekjoon 15655 N과 M (6) JAVA  (0) 2022.02.08

댓글