경비원 - 2564번
문제링크: 경비원2564
🤔접근 방법
문제에서 지도가 나와있듯이 처음에는 2차원 배열
로 접근을 할지 숫자 계산(좌표)
으로 접근할지 고민을 했다. 하지만 블록과 블록 사이를 지나가지 못한다
는 지문을 보고 숫자 계산(좌표)으로 접근했다.
어떤 기준을 가지고 계산을 해야 다양한 예시가 입력돼도 일정한 답을 도출할까를 고민했다. 이 문제를 풀 때 분기점을 나누는 방법을 생각하기까지 도움이 된 방법이다.
고정 위치(동근이)
와가변 위치(상점)
의 방향을 어떻게 처리할 것인가?- 항상 정해진 최솟값이 있는가? 이 두 생각을 가지고 계속 문제를 풀기 위해 고민했다.
🤗풀이 방법
- 고정위치와 가변위치의 방향이 같다면 길이 비교
- 다르다면 마주보고 있는지 확인하여 반대방향의 거리를 쟀을 때 최소값 도출
- 인접한다면 각 방향마다 최소값 도출
- 1~3번에서 값을 모두 더해 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int maxX, maxY;
static int shopCount;
static int[][] shops;
static int d1, p1;
public static void main(String[] args) throws IOException{
//입력
st = new StringTokenizer(br.readLine());
maxX = Integer.parseInt(st.nextToken());
maxY = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
shopCount = Integer.parseInt(st.nextToken());
shops = new int[shopCount][2];
//각 상점의 방향
//각 상점의 위치
for(int i=0; i<shopCount; i++) {
st = new StringTokenizer(br.readLine());
shops[i][0] = Integer.parseInt(st.nextToken());
shops[i][1] = Integer.parseInt(st.nextToken());
}
//동근이 방향
//동근이 위치
st = new StringTokenizer(br.readLine());
d1 = Integer.parseInt(st.nextToken());
p1 = Integer.parseInt(st.nextToken());
//왼쪽이나 오른쪽인지 확인하기
int answer = 0;
for(int i=0; i<shopCount; i++) {
int d2 = shops[i][0];
int p2 = shops[i][1];
//같은 방향인지 확인하기
if(d1 == d2) {
answer += Math.abs(p1 - p2);
continue;
}
//마주보는가 확인하기
if(d1 <= 2 && d2 <= 2) {
int left = p1 + p2 + maxY;
int right = maxX * 2 - p1 - p2 + maxY;
answer += left < right ? left : right;
continue;
} else if(d1 >= 3 && d2 >= 3) { //서동 마주볼 때
int up = p1 + p2 + maxX;
int down = maxY * 2 - p1 - p2 + maxX;
answer += up < down ? up : down;
continue;
}
//인접한 경우
boolean isNorthEast = (d1 == 1 || d1 == 4) && (d2 == 1 || d2 == 4);
boolean isSouthEast = (d1 == 2 || d1 == 4) && (d2 == 2 || d2 == 4);
boolean isSouthWest = (d1 == 2 || d1 == 3) && (d2 == 2 || d2 == 3);
if(isNorthEast) { //북,동
answer += maxX - (d1 == 1 ? p1: p2) + (d1 == 1 ? p2: p1);
} else if(isSouthEast) { //남, 동
answer += maxX + maxY - (d1 == 2 ? p1: p2) - (d1 == 2 ? p2: p1);
} else if(isSouthWest) { //남, 서
answer += (d1 == 2 ? p1: p2) + maxY - (d1 == 2 ? p2: p1);
} else {
answer += p1 + p2;
}
}
System.out.print(answer);
}
}