BOJ 2564 : 경비원(Java)

박철민·2023년 4월 7일
0

알고리즘 풀이

목록 보기
7/13

풀이

아이디어


단순하게 이 그림을 길게 펼치면 된다.

다음과 같이 마치 전개도 처럼 쭉 펼치면 x와 다른 상점들과의 거리를 계산하기 쉬워집니다.

이를 각 방향에 맞춰서 좌표를 입력받아 처리하면 문제는 쉽게 해결이 됩니다!

1. dir, idx에 따라 좌표를 1차원으로 봐꿔준다.

이런 식으로 1차원으로 표현이 완료됬다면 이제 최솟값을 구해주면 되는데 단순하게 두 점 사이에 거리를 구하는 식과 뒤로 넘어가서 구하는 식으로 구하면 된다.

Math.abs(상점 위치 - 동근 위치)를 통해 길이 Path를 구하고

최대길이 - Path를 통해 Path의 반대 방향으로 갔을 때의 길이를 구할 수 있다.

2. 상점과 동근이의 위치의 최솟값을 더해준다.

상세구현

코드

1. dir, idx에 따라 좌표를 1차원으로 봐꿔준다.

	private static int func(int dir, int idx) {
		switch(dir) {
		// 북쪽
		case 1 :
			// 아무것도 하지 않는다.
			return idx;
		// 동쪽
		case 4 :
			// 가로 길이 만큼 더해준다.
			return N + idx;
		// 남쪽
		case 2 :
			// 가로 + 세로 + 가로 역방향
			return N + M + N - idx;
		case 3 :
			// 가로 + 세로 + 가로 + 세로 역방향
			return N + M + N + M - idx;
		}
		return 0;

2. 상점과 동근이의 위치의 최솟값을 더해준다.

		int sum = 0;
		int len = 2 * (N + M);
		for(int i : mat) {
			int path = Math.abs(x - i);
			int num = Math.min(path, len - path);
			sum += num;
		}
		System.out.println(sum);

코드

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

public class No2564 {
	static int N, M, x;
	static int[] mat;
	
	public static void main(String[] args) throws IOException {
		input();
		pro();
	}

	private static void pro() {
		int sum = 0;
		int len = 2 * (N + M);
		for(int i : mat) {
			int path = Math.abs(x - i);
			int num = Math.min(path, len - path);
			sum += num;
		}
		System.out.println(sum);
	}

	private static void input() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		
		int num = Integer.parseInt(br.readLine());
		
		mat = new int[num];
		
		for(int i=0; i<num; i++) {
			st = new StringTokenizer(br.readLine());
			int dir = Integer.parseInt(st.nextToken());
			int idx = Integer.parseInt(st.nextToken());
			
			idx = func(dir, idx);
			mat[i] = idx;
		}
		st = new StringTokenizer(br.readLine());
		int dir = Integer.parseInt(st.nextToken());
		int idx = Integer.parseInt(st.nextToken());
		x = func(dir, idx);
		br.close();
	}

	private static int func(int dir, int idx) {
		switch(dir) {
		// 북쪽
		case 1 :
			// 아무것도 하지 않는다.
			return idx;
		// 동쪽
		case 4 :
			// 가로 길이 만큼 더해준다.
			return N + idx;
		// 남쪽
		case 2 :
			// 가로 + 세로 + 가로 역방향
			return N + M + N - idx;
		case 3 :
			// 가로 + 세로 + 가로 + 세로 역방향
			return N + M + N + M - idx;
		}
		return 0;
	}
}
profile
멘땅에 헤딩하는 사람

0개의 댓글