알고리즘/그리디

[백준알고리즘] 그리디 - 13305번 주유소 문제

Fenderblue 2023. 5. 14. 19:00

https://www.acmicpc.net/problem/13305

 

13305번: 주유소

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

www.acmicpc.net

 

간단하게 풀이방식을 설명하자면

현재 위치보다 뒤에 있는 도시중 더 기름값이 싼 도시가 있다면

거기까지의 거리만큼만 기름을 산다

만약 현재 위치의 기름값이 가장 싸고 뒤에 오는 모든 도시들의 기름값이 더 비싸다면

현재 위치에서 마지막 도시까지 갈 만큼의 기름을 모두 사는 식이다

58점을 받았는데 이유는 다루는 값의 범위가 크다보니 int범위 초과 때문이었다

long으로 바꾸면 해결된다

 

풀이코드

package baekjoonWeek6;

import java.io.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class BJ_13305 {     //백준 주유소 문제
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int cityCnt = Integer.parseInt(br.readLine());  //도시의 개수
        long[] road = new long[cityCnt - 1];  //도시와 도시를 잇는 도로의 거리(비용)
        long[] cost = new long[cityCnt];  //각 도시별 기름값

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < cityCnt - 1; i++) {
            road[i] = Integer.parseInt(st.nextToken());
        }
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < cityCnt; i++) {
            cost[i] = Integer.parseInt(st.nextToken());
        }

        int cur = 0;    //어디까지 왔는지 인덱스 표시
        int temp = 1;   //처음으로 cur보다 기름값이 싼 도시의 인덱스
        long tmpDist = 0;    //cur~temp까지의 거리
        long minCost = 0;    //누적되는 기름값, 최소
        while (cur < cityCnt-1) {    //마지막 도시까지 도달할떄까지 구해준다
            while (temp < cityCnt && cost[cur] <= cost[temp]) {   //기름값이 더 싼 도시가 나타날때까지 반복
                temp++;
            }
            for (int i = cur; i < temp; i++) {
                if(i >= cityCnt - 1) break;
                tmpDist += road[i]; //temp까지의 거리를 구한다
            }
            minCost += tmpDist * cost[cur]; //현재 위치의 기름값 * temp까지의 거리를 곱해 비용계산
            cur = temp;
            temp++;
            tmpDist = 0;
        }
        bw.write(Long.toString(minCost));
        bw.flush();
        bw.close();
    }
}