[JAVA] 백준 5054 : 주차의 신

hanni66·2022년 1월 9일
1

Algorithms/BOJ/JAVA

목록 보기
2/9
post-thumbnail

문제

선영이는 쇼핑하러 긴 도로에 자주 간다. 선영이는 주차를 세상에서 가장 귀찮아 하기 때문에, 아무데나 주차를 한다. 주차를 한 후에는 가려고 했던 상점으로 걸어 간다.

어느 날, 선영이는 다리가 너무 아파서 병원에 갔다. 의사는 선영이에게 되도록 조금 걷거나, 쇼핑을 하지 말라고 했다. 선영이는 쇼핑을 버릴 수 없다. 그녀의 특기를 발휘해서 가장 좋은 주차 자리를 찾으려고 한다.

긴 도로는 일직선이다. 또, 모든 상점의 위치는 정수 좌표를 가지고 있다. 주차장은 모든 정수 좌표마다 하나씩 있으며, 선영이를 위해 항상 비어있다. 선영이는 주차비를 아끼기 위해서 쇼핑을 마치기 전 까지는 주차한 차를 이동시키지 않을 것이다. 선영이는 힘이 매우 세기 때문에, 자신이 쇼핑한 물건을 모두 들지 못하는 경우는 없다. 가려고 계획한 상점은 모두 방문해야 한다.

입력

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 100) 모든 테스트 케이스는 두 줄로 이루어져 있다. 첫째 줄에는 선영이가 방문할 상점의 수 n이 주어지며 (1 ≤ n ≤ 20), 둘째 줄에는 상점의 위치가 주어진다. (0 ≤ xi ≤ 99)

출력

선영이가 가려고 했던 모든 상점을 방문하고 차로 돌아오기 위해 걸어야 하는 거리의 최솟값을 출력한다.

코드

import java.util.*;

public class baek_5054 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt(); // 테스트 케이스의 개수  
		int result[] = new int[t]; // 최소값을 저장할 배열 
		HashMap<Integer, Integer> map = new HashMap<>();
		
		for(int i=0; i<t; i++) {
			int n = sc.nextInt(); // 방문할 상점의 수 
			int array[] = new int[n]; // 상점의 위치 저장할 배열
			
			for(int j=0; j<n; j++) {
				array[j] = sc.nextInt(); // 상점의 위치
			}
			Arrays.sort(array);  // 상점의 위치 정렬 
			for(int a=1; a<n; a++) {     // hashmap에 거리만큼의 값을 저장 
				map.put(a, array[a-1] - array[a]); // 0번째 인덱스에서 1번째 인덱스 빼기 
			}
			int sum = 0;
			for(int b=1; b<n; b++) {        // sum에 각각의 거리를 저장
				sum += map.get(b);
			}
			result[i] = Math.abs(sum*2);    // 절대값으로 만들기 
		}
		for(int i=0; i<t; i++) {            // 출력문
			System.out.println(result[i]);
		}
		sc.close();
	}
}

풀이

생각보다 까다로운 문제라 고민을 많이 했습니다.
테스트 케이스 개수를 입력받고, 그 크기만큼의 배열을 생성했습니다.
상점별로 위치를 저장할 Hashmap을 생성해줍니다.
테스트케이스만큼 반복하는 반복문을 생성해 방문할 상점의 수를 입력받고, 상점의 위치를 입력할 배열을 생성합니다.
상점의 위치를 입력받아 배열에 저장하고, Arrays.sort를 이용해 정렬합니다.
위치를 정렬한 array를 hashmap에 0번째 인덱스에서 1번째 인덱스 뺀 value값을 넣어줍니다.
각각의 거리를 sum에 넣어줍니다. 이때 sum값은 음수로 나오기 때문에 Math.abs를 사용해 절댓값으로 만들어줍니다.
반복문을 사용해 거리의 최솟값을 출력합니다.

백준 링크

5054번: 주차의 신

0개의 댓글