문제의 그림은 이렇게 나와있지만
저는 편의를 위해 이렇게 옆으로 회전시켜서 구현하였습니다.
그 다음 (x, y) = (0, 0)으로 초기값을 잡고 시뮬레이션을 돌렸습니다.
진행방향은 오른쪽 -> 아래쪽 -> 왼쪽 -> 위쪽 순서입니다.
(nx ,ny)이 맵 밖으로 나가거나 방문한 좌표면 방향을 바꿔주고 다시 돌려줍니다.
이 과정에서 번호가 K에 도달하면 좌표를 출력해줍니다.
좌석은 N * M개 있으므로 만약 K가 N * M보다 크면 0을 출력하고 그냥 리턴시켜줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static boolean visit[][];
static int direct[][] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
static int N, M, K;
static void func() {
if (K > N * M) {
System.out.println(0);
return;
}
int x = 0;
int y = 0;
int idx = 0;
for (int k = 1; k <= N * M; k++) {
visit[x][y] = true;
if (k == K) {
System.out.println((x + 1) + " " + (y + 1));
return;
}
int nx = x + direct[idx][0];
int ny = y + direct[idx][1];
if (nx < 0 || ny < 0 || nx >= N || ny >= M || visit[nx][ny]) {
idx = (idx + 1) % 4;
nx = x + direct[idx][0];
ny = y + direct[idx][1];
}
x = nx;
y = ny;
}
}
static void input() throws Exception {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
K = Integer.parseInt(st.nextToken());
visit = new boolean[N][M];
}
public static void main(String[] args) throws Exception {
input();
func();
}
}
|
cs |
'algorithm > Implementation' 카테고리의 다른 글
boj 20055 컨베이어 벨트 위의 로봇 (0) | 2021.02.23 |
---|---|
boj 2331 반복수열 (0) | 2021.02.23 |
boj 16918 봄버맨 (0) | 2021.02.17 |
boj 16935 배열 돌리기 3 (0) | 2021.02.10 |
boj 1914 하노이 탑 (0) | 2021.02.07 |