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번 회전시킨 결과를 출력한다.
풀이
/*
* 1. 배열의 크기 N M 수행해야 하는 회전의 수 R(한칸씩)
* 2. N개의 줄에 배열 A의 원소
* 3. 시계 반대방향으로 회전(안쪽도 회전)
*/
코드
package com.ssafy.boj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class S2_16926_배열돌리기1 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken());
int[][] 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());
}
} // arr 만들기
for(int rc=0; rc<R; rc++) { //회전 횟수만큼 반복
int count = Math.min(N, M) / 2; //라인이 가장 긴 변/2 - 1만큼 돌아감
for(int i=0; i<count; i++) {
int num = arr[i][i];
for(int j=i+1; j<M-i; j++) // 위쪽 줄 왼쪽으로
arr[i][j-1] = arr[i][j];
for(int j=i+1; j<N-i; j++) // 오른쪽 줄 위로
arr[j-1][M-1-i] = arr[j][M-1-i];
for(int j=M-2-i; j>=i; j--) // 아래 줄 오른쪽으로
arr[N-1-i][j+1] = arr[N-1-i][j];
for(int j=N-2-i; j>=i; j--) // 왼쪽 줄 아래로
arr[j+1][i] = arr[j][i];
arr[i+1][i] = num;
}
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
결과
#자바 #java #boj #백준 #알고리즘
728x90
'알고리즘 > BOJ' 카테고리의 다른 글
[java][boj][b1] 2669. 직사각형 네개의 합집합의 면적 구하기 (0) | 2022.02.13 |
---|---|
[java][boj][s5] 2635. 수 이어가기 (0) | 2022.02.12 |
[java][boj][b1] 2563. 색종이 (0) | 2022.02.10 |
[java][boj][s5] 1158. 요세푸스 문제 (0) | 2022.02.10 |
[java][boj][b2] 2605. 줄 세우기 (0) | 2022.02.09 |