[BOJ 2564] 경비원

업데이트:

문제

  • BOJ 2564
  • 문제의 저작권은 Baekjoon Online Judge에 있습니다.

접근방식

이 문제는 조건이 많기 때문에 초기에 계획을 세우는데 오래 걸릴 수 있다.
직사각형이라고 생각하지 않고 0,0을 기준으로 직선으로 펴서 각 상점이 0,0으로 부터 각 얼마만큼 떨어져있는지 위치를 계산한다. 위치는 상점의 방향이 1,2,3,4일때 조건을 걸어서 구한다. 그리고 마지막으로 동근이의 좌표를 받아오면 이 좌표에서 아까 받은 각 상점들의 좌표를 빼서 길이를 구한다. 반시계방향일 경우도 구해야 하므로 전체 사각형 길이에서 구한 길이만큼을 뺀 후, 둘 중 가장 작은 값을 sum에 누적합한다.

코드

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

public class Main {

	static int[] point; // 직선에서의 상점 위치 배열
	static int M, N; // 가로, 길이
	static int end;
	static int sum;
	static int dist;
	static StringTokenizer st;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		st = new StringTokenizer(br.readLine());
		M = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());

		final int LENGTH = 2 * (M + N); // 직사각형 전체 길이

		int num = Integer.parseInt(br.readLine()); // 상점 개수
		
		point = new int[num];

		// 상점 입력
		for (int i = 0; i <= num; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken()); // 방향
			int b = Integer.parseInt(st.nextToken());
			
			// 사각형을 직선으로 펼쳤을때 0,0부터의 거리
			if (a == 1) {
				dist = b;
			} else if (a == 2) {
				dist = M + N + (M - b);
			} else if (a == 3) {
				dist = (2 * M) + N + (N - b);
			} else if (a == 4) {
				dist = M + b;
			}
				
			if(i == num){// 마지막 동근이 좌표
				end = dist; 
				// 위에서 구한 각 상점의 위치를 돌면서
				for (int j = 0; j < num; j++) {
					int result = Math.abs(end - point[j]);
					sum += Math.min(result, LENGTH - result); // 시계방향일때와 반시계방향일떄
				}
			}else point[i] = dist;
		}
		System.out.println(sum);
		br.close();
	}
}

카테고리:

업데이트: