문제 해석
첫번째 줄에 도시(=N)의 개수를 입력 받는다.
두번째 줄은 가장 왼쪽도시부터 가장 오른쪽 도시까지 인접한 도시끼리의 거리에 필요한 기름의 양을 입력받는다.
세번째 줄은 가장 왼쪽도시부터 가장 오른쪽 도시까지의 각 도시의 기름 1리터당 비용을 입력받는다.
모두 입력 받았다면, 가장 왼쪽 도시 -> 가장 오른쪽 도시을 가기 위한 가장 최소의 비용을 구하면 된다.
일단, 최소의 비용을 구하려면 당연히 각 도시의 기름 가격이 적은 곳에서 주유하는게 이득일 것이다.
이것만 알고 가면 문제는 크게 어려움이 없다.
예시로
도시의 개수 : 5
도시 -> 다른 도시의 거리 값 : 4 2 3 1
각 도시의 기름 값 : 3 4 2 5 1
이라고 한다면...
if(prevMin > currentValue){
cost[i] = currentValue;
prevMin = currentValue;
}else{
cost[i] = prevMin;
}
코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine()); //도시의 개수
int[] oil = new int[N-1]; //도시->다른 도시로 필요한 기름의 양
int[] cost = new int[N]; //도시별 기름 값
st = new StringTokenizer(br.readLine());
for(int i = 0; i < oil.length; i++){ //필요한 기름의 양 입력
oil[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
int prevMin = Integer.MAX_VALUE; //전인덱스 기준으로 최솟값 저장하는 변수
for(int i = 0; i < cost.length; i++){ //도시별 기름 값 입력
int currentValue = Integer.parseInt(st.nextToken());
if(prevMin > currentValue){ //이전 비용보다 현재 비용이 더 작을 경우 현재 비용으로 갱신
cost[i] = currentValue;
prevMin = currentValue;
}else{ // 같거나 클 경우
cost[i] = prevMin; // 이전 비용을 그대로 사용
}
}
br.close();
// 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수 / 리터당 가격은 1 이상 1,000,000,000 이하의 자연수
// 최종 비용은 이 두개를 곱해서 구하기 때문애 Integer 범위를 넘기게 된다.
// => long을 사용하는 이유
long result = 0; //결과(최소 비용)
for(int i = 0; i < N-1; i++){
result += ((long) cost[i] *oil[i]);
}
System.out.println(result);
}
}
결과
느낀 점
처음에는 가장 왼쪽인 지역(0)은 방문하고 가장 오른족인 지역(N) 방문하지 않으니까 0 ~ (N-1)에서 최솟 값을 구해서 0 ~ (최소값인 지역-1)만큼은 0번째의 지역의 값을 곱하고 그 후로부턴 최솟값인 지역의 값을 곱하자로 접근했다가 그렇게 되면 최솟값은 한개만 나오니까 중간에 0번째보다 작은 값인데 최솟값이 아닌 경우를 계산하지 못해 최솟값이 나오지 않았다... 그래서 처음에 접근에서 시간을 썼는데 그때그때의 최솟값을 갱신해가면 되겠다는 생각이 나서 배열을 저장할때 내림차순으로 저장될 수 있게끔 바꿨더니 금방 풀 수 있었다.