반응형
[광고 누르면 오늘의 행운 상승!!]
https://www.acmicpc.net/problem/16927
실버 아닌거같다.
너무 어려웠다ㅠ ㅠ
배열을 그냥 돌리면 시간초과가 난다. 4번 돌리기 = 0번 돌리기 와 같으므로
나머지 연산을 사용하여 몇번 돌릴지를 정해주었다. 또한 바깥쪽 배열과 안쪽 배열의
회전수도 달라야 하므로 각각 돌리기 횟수를 구해서 DFS 돌려버렸다.
import java.util.*;
import java.io.*;
public class Main {
public static final int[] dx = {1,0,-1,0};
public static final int[] dy = {0,1,0,-1};
public static int intVisit[][];
public static int map[][];
public static int N,M, time;
public static int before, after, depth, dir =0;
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
time = sc.nextInt();
map = new int[N][M];
intVisit = new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
map[i][j] = sc.nextInt();
intVisit[i][j] = -1;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(intVisit[i][j] >= 0) continue;
int num = ((N-1-(depth*2))*2) +((M-1-(depth*2))*2); //4x4 기준 12회 반복하면 한바퀴를 돈다.
if(time%num != 0) num = time%num;
for (int k = 0; k < num; k++) {
before = map[i][j];
dir = 0;
dfs(i,j);
}
depth++;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
System.out.print(map[i][j]+ " ");
}
System.out.println();
}
}
public static void dfs(int row, int col) {
if(intVisit[row][col] == -1) intVisit[row][col] = depth;
int nx = row + dx[dir];
int ny = col + dy[dir];
if(nx < 0 || nx >= N || ny < 0 || ny >= M) {
dir++;
if(dir > 3) return;
nx = row + dx[dir];
ny = col + dy[dir];
}else if(intVisit[nx][ny] != depth && intVisit[nx][ny] != -1) {
//자신의 깊이가 아니면서 방문하지 않은곳도 아닐때 (남의 깊이)
dir++;
if(dir > 3) return;
nx = row + dx[dir];
ny = col + dy[dir];
}
after = map[nx][ny];
map[nx][ny] = before;
before = after;
dfs(nx,ny);
}
}
반응형
'2. 알고리즘사이트 > 1. 백준' 카테고리의 다른 글
신기한 소수 [백준 2023][골드5][Java] (0) | 2020.03.02 |
---|---|
벽 부수고 이동하기[백준 2206][골드4][Java] (0) | 2020.03.01 |
케빈 베이컨의 6단계 법칙 [백준 1389][실버1][Java] (0) | 2020.03.01 |
로봇청소기 [백준 14503][골드5][Java] (0) | 2020.03.01 |
N과M(12) -오름차순 중복조합(중복 요소 제거)- (0) | 2020.03.01 |