2024. 1. 17. 21:00ㆍAlgorithm/JAVA
[문제]
크기가 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번 회전시킨 결과를 출력한다.
[문제해결 - 구현]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[][] arr;
static int[] dx = {0, 1, 0, -1}; // 기존 좌표 기준 상, 우, 하, 좌
static int[] dy = {1, 0, -1, 0};
static int minNum;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] input = bf.readLine().split(" ");
int N = Integer.parseInt(input[0]);
int M = Integer.parseInt(input[1]);
int R = Integer.parseInt(input[2]);
arr = new int[N][M];
for (int i = 0; i < arr.length; i++) {
String[] row = bf.readLine().split(" ");
for (int j = 0; j < arr[0].length; j++) {
arr[i][j] = Integer.parseInt(row[j]);
}
}
minNum = Math.min(N, M);
for (int i = 1; i <= R; i++) {
rotate();
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
static void rotate() {
for(int t=0; t<minNum/2; t++) { // 회전 시킬 그룹의 갯수 구하기
int x = t;
int y = t;
int temp = arr[x][y]; // 마지막에 넣을 값 미리 빼놓음
int idx = 0; // 우, 하, 좌, 상 방향으로 이동하며 반시계 방향으로 값 넣을 인덱스
while(idx < 4) { // 왼쪽으로 넣는, 위로 넣는, 오른쪽으로 넣는, 아래로 넣는 연산을 차례로 수행
int nx = x + dx[idx];
int ny = y + dy[idx];
// 범위 안이라면
if(nx < arr.length-t && ny < arr[0].length-t && nx >= t && ny >= t) {
arr[x][y] = arr[nx][ny];
x = nx;
y = ny;
}
// 범위를 벗어났다면 다음 방향으로 어감
else {
idx++;
}
}
arr[t+1][t] = temp; // 빼 놓은 값 넣어 줌
}
}
}
'Algorithm > JAVA' 카테고리의 다른 글
[Algorithm /프로그래머스] 크기가 작은 부분 문자열 (0) | 2024.09.20 |
---|---|
[Algorithm /프로그래머스] 가장 가까운 같은 글자 (0) | 2024.09.19 |
[Algorithm /백준] 1916 최소비용 구하기 (0) | 2024.01.15 |
[Algorithm /백준] 1987 알파벳 (0) | 2024.01.14 |
[Algorithm /백준] 12851 숨바꼭질 2 (0) | 2024.01.13 |