코테 공부

배열돌리기2(백준 16927번, 자바)☆

DaEun_ 2023. 2. 15. 08:42

 

 

 

<<내가 생각한 최적화 방안>>

회전 횟수가 한바퀴를 넘어가는 경우, 일일이 다 도는 것이 아니라, 회전횟수 % 한바퀴 회전 횟수 의  값을 회전 횟수로 지정한다!!

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

public class Main {

	static int[][] s;
	static int N,M,K;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		N=Integer.parseInt(st.nextToken());
		M=Integer.parseInt(st.nextToken());
		K=Integer.parseInt(st.nextToken());
		s=new int[N][M];
		
		for(int i=0;i<N;i++) {
			StringTokenizer st2=new StringTokenizer(br.readLine());
			for(int j=0;j<M;j++) {
				s[i][j]=Integer.parseInt(st2.nextToken());
			}
		}
		int minn=Math.min(N/2, M/2);
		int ma=Math.max(N,M); 
        int mi=Math.min(N,M);
     
            
		for(int i=0;i<minn;i++) {
            int count=2*(ma-i*2)+2*Math.max(0,(mi-(i+1)*2)); //한바퀴 회전 횟수  
            for(int j=0;j<K%count;j++)
				rotate(i);	
			}
			print();
		}
		


	
	static void rotate(int x) {
	
		int temp=s[x][x];
		
		for(int i=x;i<M-1-x;i++) {
			s[x][i]=s[x][i+1];
		}
		for(int i=x;i<N-1-x;i++) {
			s[i][M-1-x]=s[i+1][M-1-x];
		}
		
		for(int i=M-1-x;i>x;i--) {
			s[N-1-x][i] =s[N-1-x][i-1];
		}
		
		for(int i=N-1-x;i>x;i--) {
			s[i][x]=s[i-1][x];
		}

		s[1+x][x]=temp;
	}
	
	static void print() {
		for(int[] ss: s) {
			for(int sss: ss)System.out.print(sss+" ");
			System.out.println();
		}
	}
}