Seren dev's blog
article thumbnail

https://www.acmicpc.net/problem/17276

 

17276번: 배열 돌리기

각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다. 

www.acmicpc.net

풀이

1 ≤ T ≤ 10

1 ≤ n < 500, n은 홀수

0 ≤ |d| ≤ 360 , n은 45의 배수

-> 0 ≤ |d| / 45 ≤ 8

 

d < 0이면 d += 360

d를 45로 나눈 다음에, 그 횟수만큼 배열을 회전시킨다.

 

시간복잡도: T * (n^2 + 8*n/2) -> O(T*n^2)

 

코드

import java.util.*;
import java.io.*;

public class Main {
    

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int t = Integer.parseInt(br.readLine());
        
        while (t-- > 0) {
        	StringTokenizer st = new StringTokenizer(br.readLine());
        	int n = Integer.parseInt(st.nextToken());
        	int degree = Integer.parseInt(st.nextToken());
        	
        	if (degree < 0) degree += 360;
        	degree /= 45;
        	
        	int[][] arr = new int[n][n];
        	for (int i = 0; i < n; i++) {
        		st = new StringTokenizer(br.readLine());
        		for (int j = 0; j < n; j++) {
        			arr[i][j] = Integer.parseInt(st.nextToken());
        		}
        	}
        	
        	while (degree-- > 0) { // degree 횟수만큼 배열을 시계방향으로 45도 회전
        		rotate(arr);
        	}
        	
        	for (int i = 0; i < n; i++) {
        		for (int j = 0; j < n; j++) {
        			bw.write(arr[i][j] + " ");
        		}
        		bw.write("\n");
        	}
        }
        
        bw.flush();
        br.close();
        bw.close();
    }
    
    static void rotate(int[][] arr) {
    	int n = arr.length;
    	int[] copy = new int[n/2];
    	
    	// 가운데 열 위쪽 숫자들을 미리 copy 배열에 저장
    	for (int i = 0; i < n/2; i++) {
    		copy[i] = arr[i][n/2];
    	}
    	
    	// 8개의 줄 이동시키기
    	for (int i = 0; i < n/2; i++) {
    		arr[i][n/2] = arr[i][i];
    		arr[i][i] = arr[n/2][i];
    		arr[n/2][i] = arr[n-i-1][i];
    		arr[n-i-1][i] = arr[n-i-1][n/2];
    		arr[n-i-1][n/2] = arr[n-i-1][n-i-1];
    		arr[n-i-1][n-i-1] = arr[n/2][n-i-1];
    		arr[n/2][n-i-1] = arr[i][n-i-1];
    		arr[i][n-i-1] = copy[i];
    	}
    }
}

 

수정한 풀이

길이가 n/2인 8개의 줄을 이동시키는 것이 아니라, 길이가 n인 4개의 줄(대각선)을 이동시키면 된다.

import java.util.*;
import java.io.*;

public class Main {
    

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int t = Integer.parseInt(br.readLine());
        
        while (t-- > 0) {
        	StringTokenizer st = new StringTokenizer(br.readLine());
        	int n = Integer.parseInt(st.nextToken());
        	int degree = Integer.parseInt(st.nextToken());
        	
        	if (degree < 0) degree += 360;
        	degree /= 45;
        	
        	int[][] arr = new int[n][n];
        	for (int i = 0; i < n; i++) {
        		st = new StringTokenizer(br.readLine());
        		for (int j = 0; j < n; j++) {
        			arr[i][j] = Integer.parseInt(st.nextToken());
        		}
        	}
        	
        	while (degree-- > 0) { // degree 횟수만큼 배열을 시계방향으로 45도 회전
        		rotate(arr);
        	}
        	
        	for (int i = 0; i < n; i++) {
        		for (int j = 0; j < n; j++) {
        			bw.write(arr[i][j] + " ");
        		}
        		bw.write("\n");
        	}
        }
        
        bw.flush();
        br.close();
        bw.close();
    }
    
    static void rotate(int[][] arr) {
    	int n = arr.length;
    	int[] copy = new int[n];
    	
    	// 가운데 열 숫자들을 미리 copy 배열에 저장
    	for (int i = 0; i < n; i++) {
    		copy[i] = arr[i][n/2];
    	}
    	
    	// 4개의 줄 이동시키기
    	for (int i = 0; i < n; i++) {
    		arr[i][n/2] = arr[i][i];
    		arr[i][i] = arr[n/2][i];
    		arr[n/2][i] = arr[n-i-1][i];
    		arr[n-i-1][i] = copy[n-1-i]; // 순서 반대로 해서 집어넣기
    	}
    }
}

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!