문제
https://www.acmicpc.net/problem/16926
분석/설계
회전을 할 각 라인의 개수와 구한 각 라인을 반복하여 회전시켜야합니다.
1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.
2. 회전을 할 각 라인의 개수를 구합니다.
2X2 = 2개, 4X4 = 2개, 5x4 = 2개, 6x4 = 2개....
Math.min(N, M) / 2
3. 구한 각 라인을 반복하여 회전시킵니다.
이때 회전하는 방향을 유의해야하고 각 시작점(0,0) ... (1,1)는 임시 변수에 저장했다가 이동한 위치로 (1,0) ... (2,1)
반복이 끝날때 값을 넣어줍니다.
구현 코드
import java.util.Scanner;
public class Main {
static int M, N, R; // 가로, 새로, 회전 수
static int [][] arr;
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.
N = sc.nextInt();
M = sc.nextInt();
R = sc.nextInt();
arr = new int[N][M];
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
arr[i][j] = sc.nextInt();
}
}
// 2. 회전을 할 각 라인의 개수를 구합니다.
int line = Math.min(N, M) / 2;
// 3. 구한 각 라인을 반복하여 회전시킵니다.
for (int i=0; i<R; i++) {
for (int j=0; j<line; j++) {
int x = j;
int y = j;
int val = arr[x][y];
int idx = 0;
while(idx<4) {
int mx = x + dx[idx];
int my = y + dy[idx];
if (mx >= j && mx < N-j && my >= j && my < M-j) {
arr[x][y] = arr[mx][my];
x = mx;
y = my;
} else {
idx++;
}
}
arr[j+1][j] = val;
}
}
for (int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
sc.close();
}
}
정리
각 라인 별로 어떻게 값 이동을 구현할지를 각 라인의 수를 어떻게 구할지
처음 접하면 떠오르지 않습니다.
기존 맵의 탐색하는 유형은 많이 만나봐서 그런 방식으로 접근을 했고,
각 라인의 범위를 침범하지 않은 채로 이동을 해야했기때문에 많은 고심을 한 문제입니다.
백준 사이트에 보면 이런 유형의 문제가 많으니 많이 접해보고 다른분들의 풀이도 보면 도움이 되지 않을까 싶습니다.
참고
https://www.acmicpc.net/problem/16926