코딩테스트/BOJ

[BOJ] 2564 경비원 - JAVA

5월._. 2022. 2. 11.
728x90

1. 문제

https://www.acmicpc.net/problem/2564

 

2564번: 경비원

첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄

www.acmicpc.net

1. 어떤 경계에 있는지, 경계의 어느 위치에 있는지를 입력 받음

2. 북쪽, 남쪽은 왼쪽에서부터, 동쪽, 서쪽은 위에서부터 떨어진 거리를 입력 받음(문제 풀 때 중요)

3. 마지막에 주어지는 동근이의 위치와 나머지 상점들 간의 최단거리를 구해야 함


2. 풀이

 북쪽 맨 왼쪽을 0으로 삼고 그 나머지를 거기에 맞춰 다시 좌표를 만들면 되는 문제였다.

북쪽 0,0을 기준으로 직선으로 만드는 법

1. 북쪽은 입력받은 좌표를 그대로 넣는다.

2. 동쪽은 북쪽 너비+좌표를 넣는다.

3. 남쪽은 북쪽 너비+동쪽 높이+(남쪽 너비-좌표)를 넣는다. 시계방향이기 때문에 가로길이에서 좌표를 빼준다.

4. 서쪽은 북쪽 너비+동쪽 높이+남쪽 너비+(서쪽 높이-좌표)를 넣는다. 이유는 3과 동일하다.

 

동근이 위치는 따로 변수를 선언하지 않고 상점을 넣었던 배열 마지막에 같이 넣어주었다.

상점들 위치와 동근이 위치를 비교할 때,

어떤 좌표가 더 큰 지 모르기 때문에 절댓값으로 계산한다.

이렇게 계산한 길이와 좌표의 총 길이(너비*2+높이*2)에서 그 길이를 빼준 값 둘 중에 더 작은 값을 합계에 넣는다.

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

public class BOJ_2564_경비원 {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(in.readLine());

        int width = Integer.parseInt(st.nextToken());
        int height = Integer.parseInt(st.nextToken());
        int total = (width + height) << 1;

        int N = Integer.parseInt(in.readLine());

        //마지막 방은 동근이 위치
        int[] spots = new int[N + 1];
        for (int i = 0; i <= N; i++) {
            st = new StringTokenizer(in.readLine());
            int way = Integer.parseInt(st.nextToken());
            spots[i] = Integer.parseInt(st.nextToken());

            if (way == 2) spots[i] = width - spots[i];
            else if (way == 3) spots[i] = height - spots[i];

            switch (way) {
                case 3: spots[i] += width;
                case 2: spots[i] += height;
                case 4: spots[i] += width;
            }
        }

        //상점-동근위치 빼고, 그 길이와 토탈-길이 비교하기
        int sum = 0;
        for (int i = 0; i < N; i++) {
            int len = Math.abs(spots[N] - spots[i]);
            sum += Math.min(len, total - len);
        }

        System.out.println(sum);
    }
}

 


3. 결과

 

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 16926 배열돌리기1 - JAVA  (0) 2022.02.12
[BOJ] 2563 색종이 - JAVA  (0) 2022.02.11
[BOJ] 2578 빙고 - JAVA  (0) 2022.02.11
[BOJ] 3053 택시기하학 - JAVA  (0) 2022.02.10
[BOJ] 2605 줄세우기 - JAVA  (0) 2022.02.09

댓글