본문 바로가기

Algorithm

[백준 16926] 배열 돌리기1(Java)

반응형

https://www.acmicpc.net/problem/16926

 

16926번: 배열 돌리기 1

크기가 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]

www.acmicpc.net

문제

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.

예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.

배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.

입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.

제한

  • 2 ≤ N, M ≤ 300
  • 1 ≤ R ≤ 1,000
  • min(N, M) mod 2 = 0
  • 1 ≤ Aij ≤ 108

예제 입력 1

4 4 2

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

예제 출력 1

3 4 8 12

2 11 10 16

1 7 6 15

5 9 13 14

예제 입력 2

5 4 7

1 2 3 4

7 8 9 10

13 14 15 16

19 20 21 22

25 26 27 28

예제 출력 2

28 27 26 25

22 9 15 19

16 8 21 13

10 14 20 7

4 3 2 1

예제 입력 3

2 2 3

1 1

1 1

예제 출력 3

1 1

1 1

풀이 설명

1. 돌아갈 라인의 수를 구한다.

1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8

2. 위 예시에서는 빨간 라인, 파란 라인 총 두 개의 라인이 있는데 이는 식으로 w와 h값 중 작은 것을 2로 나눈 몫이다.

3. 돌릴 횟수만큼 반복

  3-1. 각 횟수마다 모든 라인 반복

    3-1-1. 각 라인의 첫번째 원소(0,0 / 1,1 / 2,2 ...)를 따로 저장해둔다.

    3-1-2. 한 라인의 위쪽, 오른쪽, 아래쪽, 왼쪽 순서로 반시계 방향으로 스와이프한다.

    3-1-3. 마지막 스와이프 위치에 따로 저장해둔 원소를 저장한다.

Java 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int h = Integer.parseInt(st.nextToken());
		int w = Integer.parseInt(st.nextToken());
		int n = Integer.parseInt(st.nextToken());
		
		int[][] arr = new int[h][w];
		for(int i=0; i<h; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<w; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		int count = Math.min(h, w) / 2; //돌아가는 라인?의 수
		for(int i=0; i<n; i++) { //회전 횟수만큼 반복
			
			for(int j=0; j<count; j++) { //라인들 전부 돌리기
				int temp = arr[j][j]; //맨 마지막에 넣기 위해 따로 저장!!!!배열에서 원소 위치 바꿀때 하나를 temp에 저장해두는거랑 같은 원리
				
				for(int k=j+1; k<w-j; k++)
					arr[j][k-1] = arr[j][k];
				
				for(int k=j+1; k<h-j; k++)
					arr[k-1][w-1-j] = arr[k][w-1-j];
				
				for(int k=w-2-j; k>=j; k--)
					arr[h-1-j][k+1] = arr[h-1-j][k];
				
				for(int k=h-2-j; k>=j; k--)
					arr[k+1][j] = arr[k][j];
				
				arr[j+1][j] = temp;
			}
		}
		
		for(int j=0; j<h; j++) {
			for(int k=0; k<w; k++) {
				System.out.print(arr[j][k] + " ");
			}
			System.out.println();
		}
	}
}
반응형

'Algorithm' 카테고리의 다른 글

[백준 17406] 배열 돌리기4(Java)  (0) 2021.02.10
[백준 16935] 배열 돌리기3(Java)  (0) 2021.02.10
[백준 1068] 트리(Python)  (2) 2021.02.10
[백준 1158] 요세푸스 문제(Java)  (0) 2021.02.09
[백준 2563] 색종이(Java)  (0) 2021.02.09