2564번: 경비원
첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄
www.acmicpc.net
시작점과 도착점 모두 가장자리에 있으며, 가장자리로만 인접한 좌표로 이동할 수 있습니다.
입력은 상점의 위치와 기준점에서의 거리가 주어집니다.
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 |