[BOJ 16926] 배열 돌리기1

업데이트:

문제

  • BOJ 16926
  • 문제의 저작권은 Baekjoon Online Judge에 있습니다.

접근방식

라인별로 가장 왼쪽 상단 좌표를 tmp에 임시로 저장하고 여기 부터 채워주기 위해서 반시계방향으로 방향 하나씩 for문을 돌려주면서 이동시켰다. 바로 이동시켜주면 되므로 따로 저장할 배열을 만들어줄 필요가 없었다.

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[][] map;

	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 = 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());
			}
		}//End input

		int cnt = Math.min(N, M)/2; //라인 개수

		for(int i=0; i<R; i++) {
			for(int j=0; j<cnt; j++) {
				int tmp = map[j][j]; //현재 라인 가장 왼쪽상단 값 임시저장

				//반시계방향으로 한칸씩 이동(좌우상하)
				for(int k=j+1; k<M-j; k++) {
					map[j][k-1] = map[j][k];
				}

				for(int k=j+1; k<N-j; k++) {
					map[k-1][M-j-1] = map[k][M-j-1];
				}

				for(int k=M-j-2; k>=j; k--) {
					map[N-j-1][k+1] = map[N-j-1][k];
				}

				for(int k=N-j-2; k>=j; k--) {
					map[k+1][j] = map[k][j];
				}

				map[j+1][j] = tmp;
			}
		}
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				bw.write(map[i][j]+" ");
			}
			bw.newLine();
		}

		bw.flush();
		bw.close();

	}
}