connecting the dots

[BOJ/Java] 2564 : 경비원 본문

algorithm/BOJ

[BOJ/Java] 2564 : 경비원

林 : 2021. 2. 26. 10:12

문제

 

 

 

풀이

 

블록을 가로지르지 않고 주어진 상점까지의 최소 거리를 모두 더해주어야 하는 문제

나의 풀이 방법은 다음과 같다

  1. Store라는 클래스를 만들어주고 location과 direction을 저장할 수 있도록 했다
  2. 동근이의 direction을 기준으로 왼쪽/오른쪽 direction을 리턴해주는 left/right 함수를 만들었다
  3. 동근이의 direction에 따라 거리를 구한다

사실 direction을 찾아준 거 외에는 모든 경우의 수를 따져서 푼 문제 / 이렇게 가장 바깥쪽만 사용하는 문제는 직선이라고 생각하고 배열로 풀면 더 간단할 수 있음을 알게 됐다 / 다시 풀어봐야겠다

 

코드

import java.util.*;
import java.io.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;

	public static void main(String[] args) throws Exception {
		st = new StringTokenizer(in.readLine());
		int w = Integer.parseInt(st.nextToken());
		int h = Integer.parseInt(st.nextToken());
		int n = Integer.parseInt(in.readLine());
		Store[] store = new Store[n];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(in.readLine());
			store[i] = new Store(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
		}
		st = new StringTokenizer(in.readLine());
		
		int dongDir = Integer.parseInt(st.nextToken());
		int dongLocation = Integer.parseInt(st.nextToken());
		
		int sum = 0;
		for (int i = 0; i < n; i++) {
			if (store[i].dir == dongDir) {
				sum += Math.abs(store[i].location - dongLocation);
			} else if (store[i].dir == opposite(dongDir)) {

				if (dongDir <= 2) { // 동근이가 가로축에 있으면
					sum += h + Math.min(store[i].location + dongLocation, 2 * w - store[i].location - dongLocation);
				} else {
					sum += w + Math.min(store[i].location + dongLocation, 2 * h - store[i].location - dongLocation);
				}
			} else if (store[i].dir == left(dongDir)) {
				if (dongDir == 2) {
					sum += dongLocation + h - store[i].location;
				} else if (dongDir == 3) {
					sum += dongLocation + w - store[i].location;
				} else if (dongDir == 1) {
					sum += w - dongLocation + store[i].location;
				} else {
					sum += w - store[i].location + h - dongLocation;
				}
			} else {// 오른쪽
				if (dongDir == 2) {
					sum += w - dongLocation + h - store[i].location;
				} else if (dongDir == 3) {
					sum += h - dongLocation + store[i].location;
				} else if (dongDir == 1) {
					sum += dongLocation + store[i].location;
				} else {
					sum += w - store[i].location + dongLocation;
				}
			}
		}
		System.out.println(sum);
	}

	static int left(int d) {
		if (d == 1)
			return 4;
		else if (d == 3)
			return 1;
		else if (d == 2)
			return 3;
		else
			return 2;
	}

	static int right(int d) {
		if (d == 1)
			return 3;
		else if (d == 3)
			return 2;
		else if (d == 2)
			return 4;
		else
			return 1;
	}

	static int opposite(int d) {
		if (d == 1)
			return 2;
		else if (d == 3)
			return 4;
		else if (d == 2)
			return 1;
		else
			return 3;
	}

	static class Store {
		int dir, location;

		Store(int dir, int location) {
			this.dir = dir;
			this.location = location;
		}
	}
}

 

느낀점

  • 나는 확실히 Class 하나 만들어서 여러 정보를 저장하는게 편하다 
  • 이름을 명확하게 하는게 덜 헷갈린다

'algorithm > BOJ' 카테고리의 다른 글

[BOJ/Java] 16234 : 인구이동  (0) 2021.03.16
[BOJ/Java] 17140 : 이차원 배열과 연산  (0) 2021.03.16
[BOJ/Java] 2573 : 빙산  (0) 2021.02.20
[BOJ/Java] 2502 : 떡 먹는 호랑이  (0) 2021.02.20
[BOJ/Java] 15686 : 치킨 배달  (0) 2021.02.19