✔ 배열 돌리기 1
코드 구현하기
/*
* 문제 분석하기
* : 상, 우, 하, 좌 순으로 각 줄마다 배열을 회전하도록 함
*/
/*
* 손으로 풀어보기
* 1. 배열에서 한 번의 회전 동안 몇 줄을 회전시켜야 하는지 찾도록 함
* 2. 각 회전 횟수마다 모든 줄의 가장 첫 번째 배열 값(상단의 가장 좌측 값)을 저장해놓도록 함
* 3. 상, 우, 하, 좌 순으로 각 배열 값을 회전하도록 함
* 4. 마지막에 따로 저장해둔 배열 값을 저장하도록 함
*/
/*
* 16926) 배열_돌리기_1
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N, M; // N, M(배열의 크기)
static int R; // R(수행해야 하는 회전의 수)
static int[][] arr; // arr(배열)
/*
* 배열 돌리기 준비하기
*/
static void init(StringTokenizer st) throws IOException {
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());
}
}
}
/*
* 배열 돌리기
*/
static void rotate() {
int line_count = Math.min(N, M) / 2; // line_count(한 번의 회전동안 회전시켜야 하는 줄의 수)
for (int i = 0; i < R; i++) { // 배열을 R번 회전
for (int j = 0; j < line_count; j++) {
int temp = arr[j][j]; // temp(가장 첫 번째 배열 값) - (0, 0), (1, 1) ...
for (int k = j + 1; k < M - j; k++) { // 상 회전
arr[j][k - 1] = arr[j][k];
}
for (int k = j + 1; k < N - j; k++) { // 우 회전
arr[k - 1][M - 1 - j] = arr[k][M - 1 - j];
}
for (int k = M - 2 - j; k >= j; k--) { // 하 회전
arr[N - 1 - j][k + 1] = arr[N - 1 - j][k];
}
for (int k = N - 2 - j; k >= j; k--) { // 좌 회전
arr[k + 1][j] = arr[k][j];
}
arr[j + 1][j] = temp;
}
}
}
/*
* 회전한 배열의 결과 출력하기
*/
static void print() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
init(st);
rotate();
print();
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[4134] 다음 소수 (0) | 2024.12.09 |
---|---|
[21922] 학부 연구생 민상 (0) | 2024.11.07 |
[20207] 달력 (0) | 2024.11.05 |
[2294] 동전 2 (0) | 2024.10.29 |
[1092] 배 (0) | 2024.10.07 |
✔ 배열 돌리기 1
코드 구현하기
/*
* 문제 분석하기
* : 상, 우, 하, 좌 순으로 각 줄마다 배열을 회전하도록 함
*/
/*
* 손으로 풀어보기
* 1. 배열에서 한 번의 회전 동안 몇 줄을 회전시켜야 하는지 찾도록 함
* 2. 각 회전 횟수마다 모든 줄의 가장 첫 번째 배열 값(상단의 가장 좌측 값)을 저장해놓도록 함
* 3. 상, 우, 하, 좌 순으로 각 배열 값을 회전하도록 함
* 4. 마지막에 따로 저장해둔 배열 값을 저장하도록 함
*/
/*
* 16926) 배열_돌리기_1
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N, M; // N, M(배열의 크기)
static int R; // R(수행해야 하는 회전의 수)
static int[][] arr; // arr(배열)
/*
* 배열 돌리기 준비하기
*/
static void init(StringTokenizer st) throws IOException {
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());
}
}
}
/*
* 배열 돌리기
*/
static void rotate() {
int line_count = Math.min(N, M) / 2; // line_count(한 번의 회전동안 회전시켜야 하는 줄의 수)
for (int i = 0; i < R; i++) { // 배열을 R번 회전
for (int j = 0; j < line_count; j++) {
int temp = arr[j][j]; // temp(가장 첫 번째 배열 값) - (0, 0), (1, 1) ...
for (int k = j + 1; k < M - j; k++) { // 상 회전
arr[j][k - 1] = arr[j][k];
}
for (int k = j + 1; k < N - j; k++) { // 우 회전
arr[k - 1][M - 1 - j] = arr[k][M - 1 - j];
}
for (int k = M - 2 - j; k >= j; k--) { // 하 회전
arr[N - 1 - j][k + 1] = arr[N - 1 - j][k];
}
for (int k = N - 2 - j; k >= j; k--) { // 좌 회전
arr[k + 1][j] = arr[k][j];
}
arr[j + 1][j] = temp;
}
}
}
/*
* 회전한 배열의 결과 출력하기
*/
static void print() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
init(st);
rotate();
print();
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[4134] 다음 소수 (0) | 2024.12.09 |
---|---|
[21922] 학부 연구생 민상 (0) | 2024.11.07 |
[20207] 달력 (0) | 2024.11.05 |
[2294] 동전 2 (0) | 2024.10.29 |
[1092] 배 (0) | 2024.10.07 |