본문 바로가기
BaekJoon/Silver

[BOJ/JAVA] 백준 16926 : 배열 돌리기 1 (자바)

by HoonSikE 2022. 4. 13.
반응형
SMALL
문제 정보
  문제명   - 배열 돌리기 1
  난이도   - 실버 I
문제 번호 - 16926번

문제 링크

BOJ_S2_16926_배열_돌리기_1

 

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번 회전시킨 결과를 출력한다.

예제 입력/출력
예제 입력 예제 출력
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3 4 8 12
2 11 10 16
1 7 6 15
5 9 13 14
5 4 7
1 2 3 4
7 8 9 10
13 14 15 16
19 20 21 22
25 26 27 28
28 27 26 25
22 9 15 19
16 8 21 13
10 14 20 7
4 3 2 1
2 2 3
1 1
1 1
1 1
1 1

알고리즘 분류
● 구현

소스코드
package Lv2_Silver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
 * @author HanHoon
 * @category 구현
 * https://www.acmicpc.net/problem/16926
 */
public class BOJ_S2_16926_배열_돌리기_1 {
	private static int[] dx = {0,1,0,-1};  //하우상좌
	private static int[] dy = {1,0,-1,0};  //하우상좌
	
	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[][] map = new int[N][M]; //배열 선언
		//배열에 데이터 입력
		for(int i=0;i<N;i++) {
			st=new StringTokenizer(br.readLine());
			for(int j=0;j<M;j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		//회전해야 할 사각형의 수
		//2*2 행렬에서는 1개, 5*5에서는 2개, 4*5에서는 2개, 최솟값을 2로 나누면 그룹 수가 나온다
		//이 규칙에서 항상 시작점은 x,y값이 같은 값에서 시작
		int cnt = Math.min(N, M) / 2;  
		//회전횟수
		for(int i=0;i<R;i++) {
			//그룹 갯수만큼 반복
			for(int j=0;j<cnt;j++) {
				int x = j;
				int y = j;
				
				//나중에 값을 넣기 위해 따로 저장
				int tmp = map[x][y];
				int dic=0;      // 방향
				
				while(dic<4) {
					int nx = x + dx[dic];
					int ny = y + dy[dic];
					
					if(nx>=j && ny>=j && nx<N-j && ny<M-j) {  //범위 내에 있을 경우 돌리기
						map[x][y] = map[nx][ny];
						x = nx;
						y = ny;
					}else {                                   //범위 벗어나면 방향 전환
						dic++;
					}
				}
				map[j+1][j] = tmp;
			}
		}//end for
		//출력---------------------------------------------------
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
	}
}

 


BaekJoon List
 

BaekJoon List

BOJ Start!! ● [BOJ] 백준 회원가입, 시작하는 법 ● [BOJ] 등급(티어) 및 Solved.AC 적용 ● [BOJ/JAVA] 백준 소스코드 제출 시 유의사항(자바) Bronze ● Bronze V  - ● Bronze IV  - ● Bronze III  -..

han-hoon.tistory.com


  

기회는 준비된 자에게 찾아온다.

 


 

반응형
LIST

댓글