[BOJ] 16926. 배열돌리기1 - Simulation
제출일 : 2019-10-20
문제 풀이 시간 : 3H
난이도 : ★★★
Problem
Input
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
Output
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
Constraints
- 2 ≤ N, M ≤ 300
- 1 ≤ R ≤ 1,000
- min(N, M) mod 2 = 0
- 1 ≤ Aij ≤ 10^8
Solution & Inpression
시뮬레이션 문제
시뮬레이션은 어렵다.
문제에 주어진대로 천천히 따라 코딩을 하면 되지만 2차원 배열의 인덱스 조작이 햇갈린다..
Code
언어 : JAVA
메모리 : 105,112 kb
실행시간 : 1,464 ms
import java.util.Scanner;
public class Main {
static int N, M, R, S;
static int[][] matrix, copy;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); // 배열의 크기 N*M
M = sc.nextInt();
R = sc.nextInt(); // 회전 수 R
// min(N, M) mod 2 = 0
S = Math.min(N, M) / 2; // 1회전에서 돌려야하는 사각형의 개수
matrix = new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
matrix[i][j] = sc.nextInt();
}
}
for (int i = 0; i < R; i++) {
spin();
}
print();
}
private static void print() {
for (int[] is : matrix) {
for (int i : is) {
System.out.print(i + " ");
}
System.out.println();
}
}
static void spin() {
for (int s = 0; s < S; s++) {
int T = s;
int B = N - 1 - s;
int R = M - 1 - s;
int L = s;
int tmp = matrix[s][s];
for (int i = L; i < R; i++) matrix[T][i] = matrix[T][i + 1];
for (int i = T; i < B; i++) matrix[i][R] = matrix[i + 1][R];
for (int i = R; i > L; i--) matrix[B][i] = matrix[B][i - 1];
for (int i = B; i > T; i--) matrix[i][L] = matrix[i - 1][L];
matrix[T + 1][L] = tmp;
}
}
}
'Problem > BOJ' 카테고리의 다른 글
[BOJ] 4195. 친구 네트워크 - UnionFind (0) | 2019.11.03 |
---|---|
[BOJ] 16927. 배열돌리기2 - Simulation (0) | 2019.10.20 |
[BOJ] 15685. 드래곤커브 - Simulation (0) | 2019.10.19 |
[BOJ] 17143. 낚시왕 - Simulation (0) | 2019.10.18 |
[BOJ] 17142. 연구소3 - Combination & BFS (0) | 2019.10.17 |