connecting the dots

[BOJ/Java] 16926 : 배열 돌리기1 본문

algorithm/BOJ

[BOJ/Java] 16926 : 배열 돌리기1

林 : 2021. 2. 16. 17:04

문제

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

 

풀이

수행하는 회전 수를 기준으로 for문을 돌린다. 회전을 할 때마다 시작점을 (0, 0) , (1, 1) , .. (i, i)에서 시작하도록 해서 for문의 i를 이용할 수 있다.

이후에는 해당 범위를 벗어나면 방향이 달라지도록 해주면서 한 칸씩 수를 옮긴다 / 이 때 가장 처음 칸은 temp 등의 변수에 따로 저장해두어야 나중에 값이 안 사라진다.

 

코드

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

public class Main { //배열 돌리기 1
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
	static int n, m, r;
	static int[][] arr;
	public static void main(String[] args) throws Exception {
		
		st = new StringTokenizer(in.readLine(), " ");
		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++) {
			st = new StringTokenizer(in.readLine(), " ");
			for(int j = 0; j < m; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		int num = Math.min(n, m) / 2;
		for(int i = 0; i < r; i++) { 
			rotate(num);
		}
		
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
	}
	
	private static void rotate(int num) {
		for(int i = 0; i < num; i++) {
			int direction = 0;
			int dx = i;
			int dy = i;
			int temp = arr[dx][dy];
			while(direction != 4) {
				int nextX = dx + dir[direction][0];
				int nextY = dy + dir[direction][1];
				if(nextX < i || nextY < i || nextX >= n-i || nextY >= m-i) {
					direction++;
				}
				else {
					arr[dx][dy] = arr[nextX][nextY];
					dx = nextX;
					dy = nextY;
				}
					
			}
			arr[i+1][i] = temp;
			
		}
	}
}

 

느낀점

풀고 나니 쉬웠지만 처음에는 바깥쪽만 회전할 때 어떻게 해야 할지 몰라 헤맸다