백준 16926 - (Java) 배열 돌리기1
알고리즘/백준

백준 16926 - (Java) 배열 돌리기1

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

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

1. 유형

구현

 

2. 문제 접근

  • 사격형의 4개의 귀퉁이를 설정해 줍니다
  • 사각형의 크기가 줄어들 때, 4개의 좌표를 다시 설정해줍니다
  • 저것을 R번만큼 반복하면 종료

 

2번째 풀이.

저는 위처럼 사각형의 4개의 좌표를 구해서 해결했지만,

 

변수가 4개가 필요하고 각 방향마다 for문을 써줘서 코드가 더럽습니다.

 

그래서 BFS풀이 처럼 4방향의 배열을 구해주고, 범위를 나갔을 경우 다음 방향으로 진행하는 식으로 풀이해주는 것이 

 

더 깔끔합니다.

 

3.코드

1번째 풀이

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

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		int N = stoi(st.nextToken());
		int M = stoi(st.nextToken());
		int K = stoi(st.nextToken());
		int map[][] = new int[N][M];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(in.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = stoi(st.nextToken());
			}
		}
		for (int i = 0; i < K; i++) {
			int r1 = 0, c1 = 0, r2 = N - 1, c2 = M - 1;
			while (r1 < r2 && c1 < c2) {
				int temp = map[r1][c1];
				for (int c = c1; c < c2; c++) {
					map[r1][c] = map[r1][c + 1];
				}
				for (int r = r1; r < r2; r++) {
					map[r][c2] = map[r + 1][c2];
				}
				for (int c = c2; c > c1; c--) {
					map[r2][c] = map[r2][c - 1];
				}
				for (int r = r2; r > r1 + 1; r--) {
					map[r][c1] = map[r - 1][c1];
				}
				map[r1 + 1][c1] = temp;
				r1 += 1;
				c1 += 1;
				r2 -= 1;
				c2 -= 1;
			}
		}
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<N; i++) {
			for(int j=0;j<M;j++) {
				sb.append(map[i][j]+" ");
			}
			sb.append("\n");
		}
		System.out.println(sb.toString());
	}

	static int stoi(String s) {
		return Integer.valueOf(s);
	}
}