728x90
문제
크기가 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 ≤ 109
- min(N, M) mod 2 = 0
- 1 ≤ Aij ≤ 108
풀이
배열 돌리기 1과 똑같은 소스이다.
rotate안에 count를 안에서 도는 횟수로 나누는 방법을 이용하여 R이 무한정으로 커질때 다 돌리지 않고,
4*4의 경우 제일 처음에 칸에 있는 개수는 12이다.
그러면 12을 도는것과 24를 도는것은 결국 똑같은 형태, 제자리를 유지하는 것이므로 최소한의 필요로 회전하는 횟수만 측정하였다.
참고
2022.02.09 - [Algorithm/Baekjoon] - Baekjoon 16926 배열 돌리기 1 JAVA
코드
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 2605 줄 세우기 JAVA (0) | 2022.02.09 |
---|---|
Baekjoon 16935 배열 돌리기 3 JAVA (0) | 2022.02.09 |
Baekjoon 16926 배열 돌리기 1 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 |
댓글