본문 바로가기

Algorithm

[백준] JAVA - 2564. 경비원

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

 

2564번: 경비원

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

www.acmicpc.net

생각

(0,0)에서 시작하여 직사각형을 시계방향으로 둘레를 쭉 펼쳐줬다고 생각하여 거리를 측정해줍니다. 상점의 좌표가 x이고 북쪽이면 거리는 x, 동쪽이면 거리는 C+x, 남쪽이면 C+R+(C-x), 서쪽이면 C+R+C+(R-x) 입니다.

 

(0,0) ~ 상점거리와 (0,0) 동근이의거리를 시계방향만큼 측정해줬기 때문에 반시계방향으로 거리를 측정할때는 둘레 - 시계방향으로 측정한 거리값입니다.

 

각 상점의 거리에 대해 반복문을 돌면서 동근이의 위치와 상점의 거리를 시계방향, 반시계방향으로 비교한 다음 최소값을 찾아주면 됩니다.

Java Code

package com.java.algorithm;

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

public class BOJ_2564_경비원_Re {
	static int R,C,N;
	static int[] info;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		C = Integer.parseInt(st.nextToken());
		R = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(br.readLine());
		info = new int[N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			// 1 2 3 4 북 남 서 동 
			// (0,0) -> 시계방향으로
			switch (a) {
				case 1: // 북
					info[i] = b;
					break;
				case 2: // 남
					info[i] = C+R+(C-b);
					break;
				case 3: // 서
					info[i] = C+R+C+(R-b);
					break;
				case 4: // 동
					info[i] = C+b;
					break;
			}
		}
		st = new StringTokenizer(br.readLine(), " ");
		int dir = Integer.parseInt(st.nextToken());
		int loc = Integer.parseInt(st.nextToken());
		int total = 0; //도착지까지 가야하는 길이
		switch (dir) {
			case 1: // 북
				total = loc;
				break;
			case 2: // 남
				total = C+R+C-loc;
				break;
			case 3: // 서
				total = C+R+C+R-loc;
				break;
			case 4: // 동
				total = C+loc;
				break;
		}
		System.out.println(solve(total));
	}
	private static int solve(int total) {
		int ans = 0;
		int clockwise = 0;
		for (int i = 0; i < N; i++) {
			clockwise = Math.abs(total-info[i]);
			//시계방향 vs 반시계방향 큰거 찾기
			ans += Math.min(clockwise, 2*(R+C)-(clockwise));
		}
		return ans;
	}


}