Algorithm/BOJ
BOJ 16926 배열 돌리기 1
wow
2021. 6. 8. 22:53
https://www.acmicpc.net/problem/16926
문제 분석
- 배열을 돌리는 메소드를 만들어서 돌리는 횟수만큼 메소드를 호출한다.
- 배열의 깊이만큼 회전시킨다 (가로/세로 중 더 작은 값을 2로 나눈 값(깊이)만큼 반시계방향으로 회전시켜야한다)
- 우->좌 (제일 윗줄) / 하->상 (제일 오른쪽줄) / 좌->우 (제일 아랫줄) / 상->하 (제일 왼쪽줄)의 4방향만큼 반시계방향으로 이동시킨다.
문제 풀이
1) 배열을 입력받는다.
2) 입력받은 회전 횟수만큼 회전한다.
3) 배열의 깊이만큼 회전한다.
3-1) 우/하/좌/상의 방향으로 회전시킨다.
3-2) 각 방향을 회전시킬 때 배열의 범위를 벗어나면 방향을 변경해준다.
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;
// 회전 횟수만큼 회전시키기
for (int i = 0; i < R; i++) {
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 i = 0; i < depth; i++) { // 한 줄 종료 후 배열의 깊이만큼 반복 for문
int sr = i; // 이동하는 시작 r 좌표
int sc = i; // 이동하는 시작 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 (i <= nr && i <= nc && nr < N - i && nc < M - i) { // 배열 범위 안에 있을 때
map[sr][sc] = map[nr][nc];
sr = nr;
sc = nc;
} else { // 배열 범위 벗어나면 방향 바꾸기
dir++;
}
} // 4방향 이동 완료
map[i + 1][i] = startTemp;
} // 한줄 이동 완료
}// rotate 함수 종료
}// class 종료