[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();
}
}