[백준]16926 배열 돌리기1(자바)

Jihun·2022년 2월 9일
0

BOJ

목록 보기
3/29
post-thumbnail

문제

image

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.

입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.

제한

  • 2 ≤ N, M ≤ 300
  • 1 ≤ R ≤ 1,000
  • min(N, M) mod 2 = 0
  • 1 ≤ Aij ≤ 108

입출력 예

image

풀이

min(N, M)/2개의 사각형을 각각 회전시켜주면 된다.

코드

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 Main {
	static int N,M,R;
	//이동 방향
	static int[][] d= {{1,0},{0,1},{-1,0},{0,-1}};
	//회전 시킬 배열
	static int[][] map;

	static void rotate() {
			//회전시킬 사각형 수
		int square=Math.min(N, M)/2,x,y,save,cur,index;
		for(int i=0; i<square; i++){
            x=i;y=i;
            //각 사각형의 시작 지점 저장
            save=map[x][y];
            index=0;     
            //4방향으로 돌때까지
            while(index < 4){
            	//x,y이동
                int nx=x+d[index][0];
                int ny=y+d[index][1];
                //각 사각형의 범위 안
                if(nx>=i&& nx<N-i&&ny>=i&&ny<M-i){
                	//이동한 지점의 값 저장
                	cur=map[nx][ny];
                	//이동하기 전 값으로 현재(이동한 지점)값 갱신
                	map[nx][ny]=save;
                	//이동한 지점의 기존 값으로 save값 갱신 -> 다음 이동 후 이 값으로 이동한 좌표 값 갱신을 위해
                	save=cur;
                	//x,y 이동한 좌표로 갱신
                    x=nx;
                    y=ny;
                }
                //범위를 벗어난 경우 방향 변경을 위해 +1
                else index++;
            }
        }
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		st=new StringTokenizer(br.readLine());
		N=Integer.parseInt(st.nextToken());
		M=Integer.parseInt(st.nextToken());
		R=Integer.parseInt(st.nextToken());
		map=new int[N][M];
		for(int i=0;i<N;i++) {
			st=new StringTokenizer(br.readLine());
			for(int j=0;j<M;j++) {
				map[i][j]=Integer.parseInt(st.nextToken());
			}
		}
		for(int i=0;i<R;i++) {
			rotate();
		}
		for(int[] row: map) {
			for(int n:row) {
				bw.write(n+" ");
			}
			bw.write("\n");
		}
		bw.flush();
	}
}
profile
slow and steady

0개의 댓글