https://www.acmicpc.net/problem
문제 분석
- 기존 배열 돌리기 1에서 돌리는 횟수의 크기가 커졌다.
- 모듈러 연산을 통해서 돌리는 횟수를 최소화시킨 다음 구현한다.
- 기존에 돌려야하는 횟수(R)의 반복문을 rotate메소드 안으로 가져와 깊이만큼 처리하고 해당 깊이에 맞게 회전시킨다.
- 그 외 코드는 기존 배열 돌리기 1과 동일
문제 풀이
1) 배열을 입력받는다.
2) 배열의 깊이를 확인하여 깊이만큼 회전시킨다. (배열의 깊이는 아래 그림과 같이 빨간색 한 번, 파란색 한 번이다)
(따라서 int depth = Math.min(N, M) / 2;코드를 통해 깊이를 측정한다)
3) rotate메소드를 통해 깊이만큼 회전시킨다.
4) 해당 깊이에서 모듈러 연산을 통해 몇 번 회전시킬지 정하고( int mod = R % ((N + M - 4 * j) * 2 - 4); ) 해당 횟수만큼 회전시킨다.
5) 그 외는 배열 돌리기 1과 동일하다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static int N, M, R;
private static int[] dr = { 0, 1, 0, -1 }; // 우 하 좌 상
private static int[] dc = { 1, 0, -1, 0 };
private static int[][] map;
// main 함수
public static void main(String[] args) throws NumberFormatException, IOException {
input();
}// main 함수 종료
// input 함수
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 세로 R
M = Integer.parseInt(st.nextToken()); // 가로 C
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());
}
}
int depth = Math.min(N, M) / 2;
rotate(depth);
// 출력
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}// input 함수 종료
private static void rotate(int depth) {
for (int j = 0; j < depth; j++) { // 한 줄 종료 후 배열의 깊이만큼 반복 for문
int mod = R % ((N + M - 4 * j) * 2 - 4); // 깊게 들어갈 수록 8만큼 도는 횟수를 줄여야 한 바퀴를 돌게 된다. (따라서 4*j *2를 해줘서 처리한다)
// 회전 횟수만큼 회전시키기
while (mod-- != 0) { // 여기서 mod--가 0이 된다면 한 줄에서 돌아야되는 다 돌았다는 것.
int sr = j; // 이동하는 시작 r 좌표
int sc = j; // 이동하는 시작 c 좌표
int dir = 0; // 4 방향을 나타냄
int startTemp = map[sr][sc]; // 시작 좌표 값 임시 저장
while (dir < 4) { // 4방향 이동시킴
int nr = sr + dr[dir];
int nc = sc + dc[dir];
if (j <= nr && j <= nc && nr < N - j && nc < M - j) { // 배열 범위 안에 있을 때
map[sr][sc] = map[nr][nc];
sr = nr;
sc = nc;
} else { // 배열 범위 벗어나면 방향 바꾸기
dir++;
}
} // 4방향 이동 완료
map[j + 1][j] = startTemp;
}
} // 한줄 이동 완료
}// rotate 함수 종료
}// class 종료
'Algorithm > BOJ' 카테고리의 다른 글
BOJ 14503 로봇 청소기 (0) | 2021.06.18 |
---|---|
BOJ 16935 배열 돌리기 3 (0) | 2021.06.11 |
BOJ 13335 트럭 (0) | 2021.06.08 |
BOJ 16926 배열 돌리기 1 (0) | 2021.06.08 |
BOJ 1932 정수 삼각형 (0) | 2021.04.07 |