시작점과 도착점 모두 가장자리에 있으며, 가장자리로만 인접한 좌표로 이동할 수 있습니다.
입력은 상점의 위치와 기준점에서의 거리가 주어집니다.
1 -> 북쪽
2 -> 남쪽
3 -> 서쪽
4 -> 동쪽
이렇게 위치하며
북쪽과 남쪽의 경우 왼쪽에서의 거리, 서쪽과 동쪽의 경우 위쪽에서의 거리를 나타냅니다.
10 5
3
1 4
3 2
2 8
2 3
즉 위의 케이스로는
(1, 4) : 북쪽이고, 왼쪽에서 4칸 떨어진 거리
(3, 2) : 서쪽이고, 위쪽에서 2칸 떨어진 거리
(2, 8) : 남쪽이고, 왼쪽에서 8칸 떨어진 거리
(2, 3) : 남쪽이고, 왼쪽에서 3칸 떨어진 거리
이제 모든 경우를 다 생각하여 계산해주시면 됩니다. (시작점 : (sp, sd), 도착점 : (ep, ed))
우선 시작점과 도착점의 위치(방향)이 같을 때(sp == ep)는 거리의 차이를 더합니다.
다음은 sp의 값에 따라 if문을 모두 추가하였습니다.
방향이 인접한 방향의 경우에는 각 상대방향 쪽으로 이동하는 것이 최소거리입니다.
방향이 인접한 방향이 아니라면 2방향으로 가는 경우 모두를 계산하여 최솟값을 구해주시면 됩니다.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
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 int list[][] = new int[101][2];
static int N, M, K, sp, sd, ans;
static void func() {
for (int i = 0; i < K; i++) {
int ep = list[i][0];
int ed = list[i][1];
if (sp == ep)
ans += Math.abs(sd - ed);
else if (sp == 1) {
if (ep == 2) {
ans += Math.min(M + sd + ed, M + N - sd + N - ed);
} else if (ep == 3) {
ans += (sd + ed);
} else {
ans += (N - sd + ed);
}
} else if (sp == 2) {
if (ep == 1) {
ans += Math.min(M + sd + ed, M + N - sd + N - ed);
} else if (ep == 3) {
ans += (sd + M - ed);
} else {
ans += (N - sd + M - ed);
}
} else if (sp == 3) {
if (ep == 1) {
ans += (sd + ed);
} else if (ep == 2) {
ans += (M - sd + ed);
} else {
ans += (Math.min(N + sd + ed, N + M - sd + M - ed));
}
} else {
if (ep == 1) {
ans += (sd + N - ed);
} else if (ep == 2) {
ans += (M - sd + N - ed);
} else {
ans += (Math.min(N + sd + ed, N + M - sd + M - ed));
}
}
}
System.out.println(ans);
}
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());
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
list[i][0] = Integer.parseInt(st.nextToken());
list[i][1] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
sp = Integer.parseInt(st.nextToken());
sd = Integer.parseInt(st.nextToken());
}
public static void main(String[] args) throws Exception {
input();
func();
}
}
|
cs |
'algorithm > Implementation' 카테고리의 다른 글
boj 20207 달력 (0) | 2021.04.22 |
---|---|
boj 17144 미세먼지 안녕! (0) | 2021.04.14 |
boj 16719 ZOAC (0) | 2021.03.15 |
boj 3085 사탕 게임 (0) | 2021.02.26 |
boj 8320 직사각형을 만드는 방법 (0) | 2021.02.25 |