Home 백준 - 경비원
Post
Cancel

백준 - 경비원

경비원 - 2564번

문제링크: 경비원2564

🤔접근 방법

문제에서 지도가 나와있듯이 처음에는 2차원 배열로 접근을 할지 숫자 계산(좌표)으로 접근할지 고민을 했다. 하지만 블록과 블록 사이를 지나가지 못한다는 지문을 보고 숫자 계산(좌표)으로 접근했다.

어떤 기준을 가지고 계산을 해야 다양한 예시가 입력돼도 일정한 답을 도출할까를 고민했다. 이 문제를 풀 때 분기점을 나누는 방법을 생각하기까지 도움이 된 방법이다.

  1. 고정 위치(동근이)가변 위치(상점)의 방향을 어떻게 처리할 것인가?
  2. 항상 정해진 최솟값이 있는가? 이 두 생각을 가지고 계속 문제를 풀기 위해 고민했다.

🤗풀이 방법

  1. 고정위치와 가변위치의 방향이 같다면 길이 비교
  2. 다르다면 마주보고 있는지 확인하여 반대방향의 거리를 쟀을 때 최소값 도출
  3. 인접한다면 각 방향마다 최소값 도출
  4. 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);
	}
}

-- Missing configuration options! --

Closure에 대해서

백준 - Z