Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

희디비

[백준/S1/구현/자바] 2564 경비원 본문

백준

[백준/S1/구현/자바] 2564 경비원

희디비 2024. 4. 30. 21:56

💡 문제

 

동근이는 무인 경비 회사 경비원으로 항상 대기하고 있다가 호출이 들어오면

경비차를 몰고 그 곳으로 달려가야 한다. 동근이가 담당하고 있는 곳은

직사각형 모양의 블록으로 블록 중간을 가로질러 차가 통과할만한 길이 없다.

이 블록 경계에 무인 경비를 의뢰한 상점들이 있다.

예를 들어 가로의 길이가 10, 세로의 길이가 5인 블록의 경계에 무인 경비를 의뢰한 3개의 상점이 있다고 하자.

<그림 1>과 같이 이들은 1, 2, 3으로 표시되어 있고, 동근이는 X로 표시한 위치에 있다.

 

1번 상점에서 호출이 들어 왔을 때 동근이가 블록을 시계방향으로 돌아 이동하면 이동 거리가 12가 된다.

반면 반시계방향으로 돌아 이동하면 이동 거리는 18이 된다.

따라서 동근이가 1번 상점으로 가는 최단 거리는 12가 된다.

마찬가지로 동근이의 위치에서 2번 상점까지의 최단 거리는 6, 3번 상점까지의 최단 거리는 5가 된다.

블록의 크기와 상점의 개수 및 위치 그리고 동근이의 위치가 주어질 때

동근이의 위치와 각 상점 사이의 최단 거리의 합을 구하는 프로그램을 작성하시오.

 

 입력

 

첫째줄 : 가로, 세로의 길이 

둘째줄 : 상점의 개수(n)

(가로, 세로,  상점  <=  100)

이후 (방향 + 위치 정보) n줄 

n+1줄 동근이의 위치(방향, 위치 정보)

방향 입력 조건 (북,남,서,동) 차례대로 1,2,3,4  + 위치 정보

북,남쪽 위치 정보 : 왼쪽으로부터 떨어진 거리  

서,동쪽 위치 정보 : 위쪽으로부터 떨어진 거리

 

 

💻 출력 / 제한

 

첫째줄에 동근이와 상점의 최단 거리를 출력 한다. / 시간 제한 : 1초 / 메모리 : 128MB 

 


풀이 방법 

 

문제의 설명대로 반시계, 시계 방향을 구현 하려면 동근이의 위치에 따라 구현 방식이 달라짐으로

코드가 길어 지게 된다.

 

수학적으로 접근 하여 사각형을 일직선으로 만들어서 풀었다.

 

💥 주의할점

 

2번째 그림을 넣은 이유가 있는데 좌표를 구현할때 사각형을 전개도처럼 핀다고 생각 해야 한다.

가로 10 세로 5

서쪽(보라색) 일떄 좌표는 위치 정보를 더하면 되지만 25 + 1 = 26   ex) 3 1 

북쪽(초록색) 일때 좌표는 가로길이에서 위치 정보를 빼야한다. 15 + (10 - 2) = 23  ex) 1 2

위치 정보에 따라 좌표를 실수 없게 구현하는게 중요하다.

 


전체 코드

import java.io.*;
import java.util.*;
import java.util.stream.Stream;

public class Security2564 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] widthAndHeight = Stream.of(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int width = widthAndHeight[0]; int height = widthAndHeight[1];
        int n = Integer.parseInt(br.readLine());

        int totalLength = width * 2 + height * 2;
        List<Integer> list = new ArrayList<>();

        for(int i=0; i<=n; i++) {
            int[] input = Stream.of(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            if(input[0] == 1) list.add(width + height + width - input[1]);
            else if(input[0] == 2) list.add(input[1]);
            else if(input[0] == 3) list.add(width * 2 + height + input[1]);
            else if(input[0] == 4) list.add(width + height-input[1]);
        }

        int me = list.get(n); list.remove(n);
        int sum = 0;

        for(int i : list){
            int distance = Math.abs(me - i);
            int overDistance = 0;
            if(i < me) overDistance = totalLength - me + i;
            else if(i > me) overDistance = me + totalLength - i;
            int min = Math.min(distance, overDistance);
            sum += min;
        }
        System.out.print(sum);
    }
}