지난 주에 풀어본 문제를 정리해보려고 한다.
페어코딩 스터디에서 풀어본 문제로 주어진 배열을 반시계방향으로 한칸씩 이동하는 문제였다.
public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String[] input = bf.readLine().split(" "); int N = Integer.parseInt(input[0]); int M = Integer.parseInt(input[1]); int R = Integer.parseInt(input[2]); int[][] board = new int[N][M]; for (int i = 0; i < N; i++) { String[] st = bf.readLine().split(" "); for (int j = 0; j < M; j++) { board[i][j] = Integer.parseInt(st[j]); } } int part = Math.min(N,M) / 2; for (int i = 0; i < R; i++) { int[][] out = new int[N][M]; for (int j = 0; j < part; j++) { for (int k = j+1; k < M-j; k++) { out[j][k-1] = board[j][k]; } for (int l = j; l < M-1-j ; l++) { out[N-1-j][l+1] = board[N-1-j][l]; } for (int h = N-1-j; h > j; h--) { out[h][j] = board[h-1][j]; } for (int g = N-1-j; g > j; g--) { out[g-1][M-1-j] = board[g][M-1-j]; } } board = out.clone(); } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { System.out.print(board[i][j] + " "); } System.out.println(); } }
풀이를 말로 설명하기 어렵지만, 설명을 적어보자면
회전하는 구역(part)를 우선적으로 알아야하는데 주어진 이차원 배열을 표로 만들었을 때 가장 바깥에서 회전하는 구역부터 가장 안쪽의 구역까지 회전을 시켜야 하기 때문이다.
그 다음으로 그 구역에서 상하좌우가 움직이는 방향이 모두 다르므로 각각의 방향마다 for문으로 구현을 해주었다.
이 부분에서 for문의 조건부분과 실행부분에 맞는 값을 생각하는 것이 가장 어려웠다.
과연 시간제한이 있다면 시간안에 풀어낼 수 있을지,, 걱정이다😅