백준 경비원

KIMYEONGJUN·2025년 3월 27일
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다.
둘째 줄에 상점의 개수가 주어진다.
블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다.
이어 한 줄에 하나씩 상점의 위치가 주어진다.
상점의 위치는 두 개의 자연수로 표시된다.
첫째 수는 상점이 위치한 방향을 나타내는데, 1은 블록의 북쪽, 2는 블록의 남쪽, 3은 블록의 서쪽, 4는 블록의 동쪽에 상점이 있음을 의미한다.
둘째 수는 상점이 블록의 북쪽 또는 남쪽에 위치한 경우 블록의 왼쪽 경계로부터의 거리를 나타내고, 상점이 블록의 동쪽 또는 서쪽에 위치한 경우 블록의 위쪽 경계로부터의 거리를 나타낸다.
마지막 줄에는 동근이의 위치가 상점의 위치와 같은 방식으로 주어진다.
상점의 위치나 동근이의 위치는 블록의 꼭짓점이 될 수 없다.

첫째 줄에 동근이의 위치와 각 상점 사이의 최단 거리의 합을 출력한다.

내가 이 문제를 보고 생각해본 부분

입력 처리: BufferedReader를 사용하여 입력을 효율적으로 처리한다.
StringTokenizer를 사용하여 공백으로 구분된 입력을 쉽게 파싱한다.
위치 계산: getPosition 메서드를 통해 주어진 방향과 거리를 통해 동근이와 상점의 위치를 계산한다.
각 위치는 블록의 경계를 기준으로 한 1차원 배열 인덱스처럼 표현된다.
최단 거리 계산: 두 위치 간의 최단 거리를 계산하여 합산한다.
시계방향과 반시계방향 중 더 짧은 거리로 계산한다.
출력 처리: 결과를 StringBuilder에 추가한 후 최종적으로 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

// 백준 2564번 문제
public class Main973 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 블록의 가로와 세로 길이 입력
        StringTokenizer st = new StringTokenizer(br.readLine());
        int width = Integer.parseInt(st.nextToken());
        int height = Integer.parseInt(st.nextToken());

        // 상점의 개수 입력
        int storeCount = Integer.parseInt(br.readLine());

        // 상점의 위치 저장
        int[][] stores = new int[storeCount][2];
        for(int i = 0; i < storeCount; i++) {
            st = new StringTokenizer(br.readLine());
            stores[i][0] = Integer.parseInt(st.nextToken());
            stores[i][1] = Integer.parseInt(st.nextToken());
        }

        // 동근이의 위치 입력
        st = new StringTokenizer(br.readLine());
        int dkDirection = Integer.parseInt(st.nextToken());
        int dkDistance = Integer.parseInt(st.nextToken());

        // 동근이의 위치를 계산
        int dkPosition = getPosition(dkDirection, dkDistance, width, height);

        // 최단 거리의 합을 계산
        int totalDistance = 0;
        for(int i = 0; i < storeCount; i++) {
            int storePosition = getPosition(stores[i][0], stores[i][1], width, height);
            totalDistance += Math.min(
                    Math.abs(dkPosition - storePosition),
                    2 * (width + height) - Math.abs(dkPosition - storePosition)
            );
        }

        // 결과 출력
        sb.append(totalDistance);
        System.out.println(sb.toString());
        br.close();
    }

    // 주어진 방향과 거리로부터 위치를 계산
    private static int getPosition(int direction, int distance, int width, int height) {
        switch(direction) {
            case 1: // 북쪽
                return distance;
            case 2: // 남쪽
                return width + height + (width - distance);
            case 3: // 서쪽
                return width + height + width + (height - distance);
            case 4: // 동쪽
                return width + distance;
            default:
                return -1; // 잘못된 입력
        }
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글

관련 채용 정보