본문 바로가기
BaekJoon/Silver

[BOJ/JAVA] 백준 2564 : 경비원 (자바)

by HoonSikE 2022. 3. 26.
반응형
SMALL
문제 정보
  문제명   - 경비원
  난이도   - 실버 I
문제 번호 - 2564번

문제 링크

BOJ_S1_2564_경비원

 

2564번: 경비원

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

www.acmicpc.net


문제
동근이는 무인 경비 회사 경비원으로 항상 대기하고 있다가 호출이 들어오면 경비차를 몰고 그 곳으로 달려가야 한다. 동근이가 담당하고 있는 곳은 직사각형 모양의 블록으로 블록 중간을 가로질러 차가 통과할만한 길이 없다. 이 블록 경계에 무인 경비를 의뢰한 상점들이 있다.
예를 들어 가로의 길이가 10, 세로의 길이가 5인 블록의 경계에 무인 경비를 의뢰한 3개의 상점이 있다고 하자. <그림 1>과 같이 이들은 1, 2, 3으로 표시되어 있고, 동근이는 X로 표시한 위치에 있다.
[그림 1]
1번 상점에서 호출이 들어 왔을 때 동근이가 블록을 시계방향으로 돌아 이동하면 이동 거리가 12가 된다.
반면 반시계방향으로 돌아 이동하면 이동 거리는 18이 된다. 따라서 동근이가 1번 상점으로 가는 최단 거리는 12가 된다. 마찬가지로 동근이의 위치에서 2번 상점까지의 최단 거리는 6, 3번 상점까지의 최단 거리는 5가 된다.

블록의 크기상점의 개수 및 위치 그리고 동근이의 위치가 주어질 때 동근이의 위치와 각 상점 사이의 최단 거리의 합을 구하는 프로그램을 작성하시오.

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

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

예제 입력/출력
예제 입력 예제 출력
10 5
3
1 4
3 2
2 8
2 3
23

알고리즘 분류
● 구현
● 많은 조건 분기

소스코드
package Lv2_Silver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
 * @author HanHoon
 * @category 구현, 많은 조건 분기
 * https://www.acmicpc.net/problem/2564
 */
public class BOJ_S1_2564_경비원 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		st = new StringTokenizer(br.readLine(), " ");
		// HxW 크기의  map
		int W = Integer.parseInt(st.nextToken());
		int H = Integer.parseInt(st.nextToken());
		
		int sum = 0;
		// 상점개수(T)
		int T = Integer.parseInt(br.readLine());
		int[][] store = new int[T][2];
		for (int tc = 0; tc < T; tc++) {
			st = new StringTokenizer(br.readLine(), " ");
			// 첫번쨰 수 -> 1:북, 2:남, 3:서, 4:동
			store[tc][0] = Integer.parseInt(st.nextToken());
			// 두번째 수 -> 블록으로부터 좌/상 으로부터의 거리
			store[tc][1] = Integer.parseInt(st.nextToken());
		}
		// 동근이의 위치
		st = new StringTokenizer(br.readLine(), " ");
		int A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		
		// 동근이 위치에서 상점간 최소 거리의 합
		for (int tc = 0; tc < T; tc++) {
			switch(store[tc][0]) {
			// 상점 위치가 북일 때
			case 1:
				switch(A) {
				// 동근이의 위치가 북일때
				case 1:
					sum += Math.abs(store[tc][1] - B);
					break;
				// 동근이의 위치가 남일때
				case 2:
					sum += Math.min(2*W - (store[tc][1] + B), store[tc][1] + B) + H;
					break;
				// 동근이의 위치가 서일때
				case 3:
					sum += store[tc][1] + B;
					break;
				// 동근이의 위치가 동일때
				case 4:
					sum += (W-store[tc][1]) + B;
					break;
				}
				break;
			// 상점 위치가 남일 때
			case 2:
				switch(A) {
				// 동근이의 위치가 북일때
				case 1:
					sum += Math.min(2*W - (store[tc][1] + B), store[tc][1] + B) + H;
					break;
				// 동근이의 위치가 남일때
				case 2:
					sum += Math.abs(store[tc][1] - B);
					break;
				// 동근이의 위치가 서일때
				case 3:
					sum += store[tc][1] + (H-B);
					break;
				// 동근이의 위치가 동일때
				case 4:
					sum += (W-store[tc][1]) + (H-B);
					break;
				}
				break;
			// 상점 위치가 서일 때
			case 3:
				switch(A) {
				// 동근이의 위치가 북일때
				case 1:
					sum += store[tc][1] + B;
					break;
				// 동근이의 위치가 남일때
				case 2:
					sum += (H-store[tc][1]) + B;
					break;
				// 동근이의 위치가 서일때
				case 3:
					sum += Math.abs(store[tc][1] - B);
					break;
				// 동근이의 위치가 동일때
				case 4:
					sum += Math.min(2*H - (store[tc][1] + B), store[tc][1] + B) + W;
					break;
				}
				break;
			// 상점 위치가 동일 때			
			case 4: 
				switch(A) {
				// 동근이의 위치가 북일때
				case 1:
					sum += store[tc][1] + (W-B);
					break;
				// 동근이의 위치가 남일때
				case 2:
					sum += (H-store[tc][1]) + (W-B);
					break;
				// 동근이의 위치가 서일때
				case 3:
					sum += Math.min(2*H - (store[tc][1] + B), store[tc][1] + B) + W;
					break;
				// 동근이의 위치가 동일때
				case 4:
					sum += Math.abs(store[tc][1]-B);
					break;
				}
				break;
			default: break;
			}
		}
		System.out.println(sum);
		br.close();
	}
}

 


BaekJoon List
 

BaekJoon List

BOJ Start!! ● [BOJ] 백준 회원가입, 시작하는 법 ● [BOJ] 등급(티어) 및 Solved.AC 적용 ● [BOJ/JAVA] 백준 소스코드 제출 시 유의사항(자바) Bronze ● Bronze V  - ● Bronze IV  - ● Bronze III  -..

han-hoon.tistory.com


  

기회는 준비된 자에게 찾아온다.

 


 

반응형
LIST

댓글