본문 바로가기

Problem Solving/백준BOJ

[백준BOJ] 16926번 배열 돌리기 1.java

728x90
반응형
SMALL

 

백준 저지에서 배열 돌리기1을 자바를 통해 풀어 보았다. 

 

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

16926번 배열 돌리기.java

 

GitHub - tomy9729/Algorithm: 🐗 내가 직접 작성한 내 코드 🐗

🐗 내가 직접 작성한 내 코드 🐗. Contribute to tomy9729/Algorithm development by creating an account on GitHub.

github.com

 

 

16926번 배열 돌리기 1

문제

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

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

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

설명

배열은 각자의 테두리에 맞게 돌아간다. 가장 바깥쪽 테두리에 있는 숫자들끼리 돌아가고 그 다음은 바로 안쪽 테두리에 있는 숫자들끼리 돌아간다. 먼저 이 테두리의 개수를 구해야한다. 테두리의 개수는 가로, 세로 길이 중 더 짧은 길이를 2로 나눈만큼 존재한다. 즉 min(M,N)/2만큼 있다.

 

각 테두리는 R번 돌아간다. 즉 1번 배열을 돌리는 함수를 구현하면 이 함수를 R번 반복하면 된다. 방향은 우하좌상 순서대로 진행되며 테두리에서 더 이상 나아갈 공간이 없으면 방향을 바꾼다. 이 순서대로 배열을 한칸 씩 땡겨주면 된다. 단 제일 처음에 접근하는 배열은 따로 저장해놓고 마지막 배열에 저장해야한다.

 

각 테두리의 시작은 무조건 (n,n)이다. 각 테두리마다 시작점을 기준으로 위 과정을 반복한다.

 

단순 구현 문제이지만 생각보다 까다로운 문제였다.

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class 배열_돌리기_1_16926 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	static StringBuilder sb = new StringBuilder();
	static String line;
	static StringTokenizer st;
	
	static int N;
	static int M;
	static int R;
	static int[][] arr;
	
	static int[] dI = {0,1,0,-1};
	static int[] dJ = {1,0,-1,0};
	
	public static void main(String[] args) throws IOException {
		line = br.readLine();
		st = new StringTokenizer(line, " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		arr = new int[N][M];
		
		for(int i=0;i<N;i++) {
			line = br.readLine();
			st = new StringTokenizer(line, " ");
			for(int j=0;j<M;j++) {
				arr[i][j]=Integer.parseInt(st.nextToken());
			}
		}
		
		int count = Math.min(M, N)/2;
		for(int r=0;r<R;r++) {
			for(int c=0;c<count;c++) {
				int i=c;
				int j=c;
				int start = arr[i][j];
				int d=0;
				while(d<4) {
					int nextI = i+dI[d];
					int nextJ = j+dJ[d];
					if(c <= nextI && nextI < N-c && c <= nextJ && nextJ < M-c) {
						arr[i][j]=arr[nextI][nextJ];
						i = nextI;
						j = nextJ;
					}
					else d++;
				}
				arr[c+1][c] = start;
			}
		}
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				sb.append(arr[i][j]+" ");
			}sb.append("\n");
		}
		bw.write(sb.toString());
		bw.flush();
		bw.close();
	}
}
728x90
반응형
SMALL