반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [백준 알고리즘] 백준 16926번 배열돌리기1 자바(Java)

1) 문제번호 : 16926번

 

2) 문제 출처

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

 

2. 문제

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

3. 제약사항

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

 

4. 입력

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

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

 

5. 출력

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

6. 풀이

- 먼저, 입력 받은 배열에서 돌려야 하는 그룹 개수를 구해야 한다.

- 3*3 배열에서는 1개, 5*5 배열에서는 2개 6*6 배열에서는 3개, 4*5배열에서는 2개를 구하는 방법에서 N과 M 중 최솟값을 찾아 2로 나누면 그룹 개수가 구해진다.

- 그래서 배열 범위를 구하면 되는데, 항상 첫 시작은 (0,0), (1,1), (2,2) ... 이렇게 시작이 된다.

- 즉, group_level에 따라 시작점이 달라지고, N-j, M-j를 통해 다른 범위도 구할 수 있다.

- 범위 내에서 나는 우상좌하 순으로 배열을 돌렸다. 그래서, 맨 처음의 (0,0), (1,1) 등의 값을 따로 저장하여 그 아래칸에 마지막에 넣어줬다.

7. 소스 코드

import java.util.*;

public class Main {
	private static int[] dx = {0,1,0,-1};//우상좌하
	private static int[] dy = {1,0,-1,0}; //우상좌하
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(); //배열크기
		int M = sc.nextInt(); //배열크기
		int R = sc.nextInt(); //회전 수
		
		int[][] arr = new int[N][M]; //배열 선언
		
		//배열 입력
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				arr[i][j] = sc.nextInt();
			}
		}
		
		//돌려야하는 그룹 개수
		//2*2 행렬에서는 1개, 5*5에서는 2개, 4*5에서는 2개, 최솟값을 2로 나누면 그룹 수가 나온다.
		//이 규칙에서 항상 시작점은 x,y값이 같은 값에서 시작
		int group_value = Math.min(N, M) / 2;
		
		
		//회전횟수
		for(int i=0;i<R;i++) {
			//그룹 갯수만큼 반복
			for(int j=0;j<group_value;j++) {
				int x = j;
				int y = j;
				
				//나중에 값을 넣기 위해 따로 저장
				int value = arr[x][y];
				
				int idx=0;// 방향
				
				while(idx<4) {
					int nx = x + dx[idx];
					int ny = y + dy[idx];
					
					//범위 내에 있을 경우 돌려
					if(nx>=j&&ny>=j&&nx<N-j&&ny<M-j) {
						arr[x][y] = arr[nx][ny];
						x = nx;
						y = ny;
					}
					//범위 벗어나면 방향 전환
					else idx++;
				}
				arr[j+1][j] = value;
			}
		}
		
		//출력
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기