connecting the dots
[BOJ/Java] 16926 : 배열 돌리기1 본문
문제
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
풀이
수행하는 회전 수를 기준으로 for문을 돌린다. 회전을 할 때마다 시작점을 (0, 0) , (1, 1) , .. (i, i)에서 시작하도록 해서 for문의 i를 이용할 수 있다.
이후에는 해당 범위를 벗어나면 방향이 달라지도록 해주면서 한 칸씩 수를 옮긴다 / 이 때 가장 처음 칸은 temp 등의 변수에 따로 저장해두어야 나중에 값이 안 사라진다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main { //배열 돌리기 1
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
static int n, m, r;
static int[][] arr;
public static void main(String[] args) throws Exception {
st = new StringTokenizer(in.readLine(), " ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
arr = new int[n][m];
for(int i = 0; i < n; i++) {
st = new StringTokenizer(in.readLine(), " ");
for(int j = 0; j < m; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
int num = Math.min(n, m) / 2;
for(int i = 0; i < r; i++) {
rotate(num);
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
private static void rotate(int num) {
for(int i = 0; i < num; i++) {
int direction = 0;
int dx = i;
int dy = i;
int temp = arr[dx][dy];
while(direction != 4) {
int nextX = dx + dir[direction][0];
int nextY = dy + dir[direction][1];
if(nextX < i || nextY < i || nextX >= n-i || nextY >= m-i) {
direction++;
}
else {
arr[dx][dy] = arr[nextX][nextY];
dx = nextX;
dy = nextY;
}
}
arr[i+1][i] = temp;
}
}
}
느낀점
풀고 나니 쉬웠지만 처음에는 바깥쪽만 회전할 때 어떻게 해야 할지 몰라 헤맸다
'algorithm > BOJ' 카테고리의 다른 글
[BOJ/Java] 4963 : 섬의 개수 (0) | 2021.02.16 |
---|---|
[BOJ/Java] 17406 : 배열 돌리기4 (0) | 2021.02.16 |
[BOJ/Java] 20055 : 컨베이어 벨트 위의 로봇 (0) | 2021.02.10 |
[BOJ/Java] 1158 : 요세푸스 문제 (0) | 2021.02.09 |
[BOJ/Java] 14503 : 로봇 청소기 (0) | 2021.02.08 |