Algorithm/백준 알고리즘

백준_2564 경비원(자바) / 구현

미스터로즈 2021. 4. 16. 08:44

시간 & 메모리 제한

문제

입력 & 출력

구현을 이용한 문제풀이

package com.Back;

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

public class Back_2564_2 {
	static ArrayList<point> arr = new ArrayList<>();
	static int C,R,num,ans;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		num = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < num+1; i++) {
			st = new StringTokenizer(br.readLine());
			int dir = Integer.parseInt(st.nextToken());
			int len = Integer.parseInt(st.nextToken());
			if(dir==1) {
				arr.add(new point(0, len));
			}else if(dir==2) {
				arr.add(new point(C, len));
			}else if(dir==3) {
				arr.add(new point(len, 0));
			}else if(dir==4) {
				arr.add(new point(len,R));
			}
		}
		search();
		System.out.println(ans);
	}
	private static void search() {
		for (int i = 0; i < num; i++) {
			if(Math.abs(arr.get(num).x-arr.get(i).x)==C) {
				ans+=C;
				ans+=Math.min(arr.get(num).y+arr.get(i).y, 2*R-arr.get(num).y-arr.get(i).y);
			}else if(Math.abs(arr.get(num).y-arr.get(i).y)==R) {
				ans+=R;
				ans+=Math.min(arr.get(num).x+arr.get(i).x, 2*C-arr.get(num).x-arr.get(i).x);
			}else {
				ans+=Math.abs(arr.get(num).x-arr.get(i).x);
				ans+=Math.abs(arr.get(num).y-arr.get(i).y);
			}
		}
	}
	static class point{
		int x;
		int y;
		public point(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}
	}
}

- step1. 값을 받아오는 경우 방향과 길이값을 받아옵니다. 받는 동시에 ArrayList에 위치를 넣어줍니다.

 

- step2. 각각의 값을 계산하는 함수를 만들어 줍니다.

 

- step3. 고려해봐야 하는 사항은 정 반대에 있는 경우입니다. 동쪽, 서쪽인 경우와 서쪽, 북쪽인 경우로 나눠서 풀이를 진행하면 됩니다.

 

그림과 같이 두 값을 비교해서 최솟값을 선택해주면 됩니다.