13305문제 주유소(그리디) Java

2021. 9. 24. 21:02알고리즘/백준

반응형

문제

어떤 나라에 N개의 도시가 있다. 이 도시들은 일직선 도로 위에 있다. 편의상 일직선을 수평 방향으로 두자. 제일 왼쪽의 도시에서 제일 오른쪽의 도시로 자동차를 이용하여 이동하려고 한다. 인접한 두 도시 사이의 도로들은 서로 길이가 다를 수 있다. 도로 길이의 단위는 km를 사용한다.

처음 출발할 때 자동차에는 기름이 없어서 주유소에서 기름을 넣고 출발하여야 한다. 기름통의 크기는 무제한이어서 얼마든지 많은 기름을 넣을 수 있다. 도로를 이용하여 이동할 때 1km마다 1리터의 기름을 사용한다. 각 도시에는 단 하나의 주유소가 있으며, 도시 마다 주유소의 리터당 가격은 다를 수 있다. 가격의 단위는 원을 사용한다.

예를 들어, 이 나라에 다음 그림처럼 4개의 도시가 있다고 하자. 원 안에 있는 숫자는 그 도시에 있는 주유소의 리터당 가격이다. 도로 위에 있는 숫자는 도로의 길이를 표시한 것이다

제일 왼쪽 도시에서 6리터의 기름을 넣고, 더 이상의 주유 없이 제일 오른쪽 도시까지 이동하면 총 비용은 30원이다. 만약 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10) 다음 번 도시까지 이동한 후 3리터의 기름을 넣고(3×2 = 6) 다음 도시에서 1리터의 기름을 넣어(1×4 = 4) 제일 오른쪽 도시로 이동하면, 총 비용은 20원이다. 또 다른 방법으로 제일 왼쪽 도시에서 2리터의 기름을 넣고(2×5 = 10) 다음 번 도시까지 이동한 후 4리터의 기름을 넣고(4×2 = 8) 제일 오른쪽 도시까지 이동하면, 총 비용은 18원이다.

각 도시에 있는 주유소의 기름 가격과, 각 도시를 연결하는 도로의 길이를 입력으로 받아 제일 왼쪽 도시에서 제일 오른쪽 도시로 이동하는 최소의 비용을 계산하는 프로그램을 작성하시오.

입력

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다. 다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다. 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다

출력

표준 출력으로 제일 왼쪽 도시에서 제일 오른쪽 도시로 가는 최소 비용을 출력한다

서브태스크

번호 배점 제한
1 17 모든 주유소의 리터당 가격은 1원이다.
2 41 2 ≤ N ≤ 1,000, 제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 최대 10,000, 리터 당 가격은 최대 10,000이다.
3 42 원래의 제약조건 이외에 아무 제약조건이 없다.

 

출처: <https://www.acmicpc.net/problem/13305>

 

13305번: 주유소

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1

www.acmicpc.net

 

 

##문제이해##

비싼곳에서는 이동할만큼만 주유를 하고 싼곳에서는 많이넣는게 포인트인데 이걸 어떻게 풀이할지가..고민이였다.

도시의 가격들을 모두 받고 도시에서 넣고 떠난다고 도시에서 무조건 넣어야하는게 아니기때문에! 잔머리를 썼다!

 

예를들어 예제에서 나온 5라는 가격을 가진 주유소에서 필요거리(2) 만큼만 주유를 먼저 진행한다.

그리고 변수값에 prevPrice=5 주유한 가격을 보관한다.

 

다음도시를 방문했을때 주유가격(2)가지고 비교해서 5>2 이전 주유소가 비싸다면 여기도시에서 기름을 동일하게 최소값으로 넣고 prevPrice가격을 갱신처리.(prevPrice =2)

 

다음도시를 방문했을때 주유가격(4)가지고 비교해서 2<4 이전가격이 싸다면 여기서 주유하는게 아니라 이전도시에서 주유했다고 가정하고 prevPrice 저장된 요금으로 주유를 수행한다.

##내코드##

import java.util.Scanner;

public class boj_13305 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();//점 갯수
		long needOli[] = new long[N];
		//필요한 이동시 필요한 것 받기
		for(int i=0; i<N-1; i++) {
			needOli[i]=sc.nextLong();
		}
		//주유소 가격 받기
		long city[] = new long[N]; 
		for(int i=0; i<N; i++) {
			city[i]=sc.nextLong();
		}
		
		
		//수행
		long total=0;
		long prevPrice=0; //이전에 산 가격 임시저장용 변수
		for(int i=0; i<N; i++) {
			//최초도시일경우 일단 필요한만큼 산다.
			if(i==0) {
				long price = city[i];
				long need =needOli[i];
				total += price*need; // 5*2;
				prevPrice=price;
			}else {
				//현재 주유가격이 이전가격보다 비싸다면 이전 주유소에서 더 넣었다고 가정하고 최소가격으로 더 넣는다.
				if(prevPrice<city[i]) {
					long price = prevPrice;
					long need = needOli[i];
					total += price*need; // 5*2;
				//현재 주유가격이 이전보다 싸거나 같다면 여기서 주유한다.
				}else if(prevPrice>=city[i]) {
					long price = city[i];
					long need =needOli[i];
					total += price*need; // 5*2;
					prevPrice=price;
				}
			}
		}
		System.out.println(total);
	}

}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

2164문제 카드2(큐/덱) Java  (0) 2021.09.24
10773문제 제로(Stack) Java  (0) 2021.09.24
11399문제 ATM(그리디) Java  (0) 2021.09.24
1931문제 회의실 배정(그리디) Java  (0) 2021.09.24
11047문제 동전(그리디) Java  (0) 2021.09.24