본문 바로가기

Algorithm/BOJ

[ BOJ ] 2564. 경비원 S1 JAVA

반응형


문제 이해
예를 들어 가로의 길이가 10, 세로의 길이가 5인 블록의 경계에 무인 경비를 의뢰한 3개의 상점이 있다고 하자. <그림 1>과 같이 이들은 1, 2, 3으로 표시되어 있고, 동근이는 X로 표시한 위치에 있다.


첫째 줄에 동근이의 위치와 각 상점 사이의 최단 거리의 합을 출력한다.        
아이디어
시계방향대로 거리를 구하고 마지막에 반시계방향이랑 비교해서 더 작은 값을 지정한다.
참고로 반시계방향은 전체거리 - 시계방향하면 된다.

북쪽


  동쪽
남쪽
서쪽
코드
package bj.silver;

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

/*
 * 시계 방향일때
 * 1: 북 -> val
 * 2: 남 -> N*2 + M - val
 * 3: 서 -> 2(M+N) - val
 * 4: 동 -> N + val
 * 반시계 방향일 때 위치 = 2(M+N)-시계방향일때 위치
 */
public class bj_2564_S1 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int N = Integer.parseInt(st.nextToken());// 세로길이
		int M = Integer.parseInt(st.nextToken());// 가로길이
		int shopCnt = Integer.parseInt(br.readLine());// 상점위치
		int[] dists = new int[shopCnt+1];// 각 위치별 거리(하나의 직선으로생각)
		for(int i=0;i<shopCnt+1; ++i) {	// 상점 개수만큼 반복한다.
			st = new StringTokenizer(br.readLine()," ");	
			int dir = Integer.parseInt(st.nextToken());	// 방향
			int val = Integer.parseInt(st.nextToken());	// 값
			int dist = 0;	// 임시 거리 변수
			if(dir == 1) dist = val;// 북
			else if(dir == 2) dist = 2*N + M - val;	// 남
			else if(dir == 3) dist = 2*(N + M) - val;// 서
			else if(dir == 4) dist = N + val;// 동
			dists[i] = dist;// 거리를 넣어준다.
		}	
		int me = dists[shopCnt];// 내 거리값을 저장한다.
		int sum =0;	// 거리의 합을 저장할 변수
		for(int i=0;i<shopCnt;++i) {		
			int clockwise = Math.abs(me-dists[i]);// 시계 방향의 거리값
			sum += Math.min(clockwise, 2*(N+M) - clockwise);// 반시계랑 비교해서 더 작은 값을 더한다.
		}
		System.out.println(sum);		// 출력해준다.
	}
}

 


 

집사는개발자가되고파

 

choppadontbiteme.tistory.com

 

반응형