메뉴 닫기

[BOJ] 17276 배열 돌리기

17276번: 배열 돌리기 (acmicpc.net)

음. 배열돌리기 시리즈 풀고있는데, 수업시간에 푼것 보다는 쉬웠다.
물론 시간은 엄청 오래걸렸는데 다 풀고나니 쉬운 문제였다.

핵심아이디어 몇 가지 소개하자면 45도로 돌리기 때문에 축을 기준으로 회전시키면 된다.
for문에서 별찍기를 했을때 모래시계처럼 나오게 하는것과 느낌이 비슷하다.
이 문제 자체에서 배열도 정사각형에 홀수크기의 배열이 나오기 때문에 축을 하나씩 이동시키는 방법으로 풀었다.
그리고 -각도가 나오는경우 입력 조건에서 -360도 가지 나오는데 -360도 는 0도와 같고 -45도와 335도가 같은 성질을 이용해서 -값이 나오면 +360도를 더해주었다.
이 더해진 각도에서 회전을 1회 수행할 때 마다 45도를 빼주었고, 각도가 0도가 될때까지 반복했다.

package com.algo.boj;

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

public class BOJ17276Rotate {

	static StringBuilder sb = new StringBuilder();
	private static int R;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		for (int testCase = 0; testCase < T; testCase++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			R = Integer.parseInt(st.nextToken());
			int[][] map = new int[R][R];
			int[][] storage = new int[R][R];
			int spin = Integer.parseInt(st.nextToken());
			if(spin<0) spin+=360;

			for (int i = 0; i < R; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j = 0; j < R; j++) {
					int temp = Integer.parseInt(st.nextToken());
					map[i][j] = temp;
				}
			} // input
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < R; j++) {
					storage[i][j]= map[i][j];
				}
			}
			while(spin!=0) {
				rotationMap(map, storage);
				spin-=45;
			}
			//출력
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < R; j++) {
					sb.append(storage[i][j]).append(" ");
				}
				sb.append('\n');
			}
		}
		System.out.print(sb);
	}

	private static void rotationMap(int[][] map, int[][] storage) {
		for ( int i = 0; i < R; ++i ) {
			storage[i][i] = map[R/2][i];        //  \          
			storage[i][R/2] = map[i][i];        //    |          
			storage[i][(R-1)-i] = map[i][R/2];  //      /  
			storage[R/2][i] = map[(R-1)-i][i];  //    -  
		}
		for (int i = 0; i < storage.length; i++) {
			for (int j = 0; j < storage.length; j++) {
				map[i][j]=storage[i][j];
			}
		}
	}

}

시간이 오래 걸렸던 이유중 하나로는 처음에 입력을 받는 배열과 동일한 크기의 배열을 한개 더 생성해서 복사하는 과정에서 copy를 해줬어야 하는데, copy를 하지 않고 참조만 해줬더니 값이 이상한 값이 나왔었다.
배열의 값을 복사할 때 단순히 참조변수만 설정하지 않도록 앞으로 주의해야겠다.

Related Posts

답글 남기기

이메일 주소는 공개되지 않습니다.

%d 블로거가 이것을 좋아합니다: