PS(Problem Solving)/BOJ

[백준/BOJ] 13305번: 주유소

JunsuKim 2022. 9. 15.
728x90

문제

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

 

13305번: 주유소

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

www.acmicpc.net

해설

각 도시마다의 기름값이 나와있고, 기름 1L 당 1KM를 갈 수 있다.

우선 첫번째 도시에선 기름값이 얼마든지간에 기름을 넣어야 한다.

즉, 총 기름값을 저장할 변수를 total이라 했을 때, total의 초기값은 (첫 번째 도시의 기름값 + 첫 번째 도로의 길이)가 된다.

또한 맨 마지막 도시에선 더 갈 도로가 없으므로 기름값을 신경쓸 필요가 없다.

이는 반복문을 할 때 1부터 n-1까지만 확인해주면 된다는 것을 알 수 있다.

다음 도시의 기름값이 이전 도시의 기름값보다 비싸다면 이전 도시에서 기름을 더 많이 넣고 오는 것이 이득이다.

따라서 이전 도시의 기름값을 저장할 변수를 선언하여 이전 도시의 기름값이 더 싸다면 (이전 도시의 기름값 * 이동할 거리)를 total에 더해주면 된다.

코드

import java.util.*

private lateinit var road: LongArray
private lateinit var oilPrice: LongArray

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()

    road = LongArray(n - 1)
    oilPrice = LongArray(n)

    var st = StringTokenizer(readLine())
    repeat(n - 1) { i ->
        road[i] = st.nextToken().toLong()
    }

    st = StringTokenizer(readLine())
    repeat(n) { i ->
        oilPrice[i] = st.nextToken().toLong()
    }

    totalPrice(n)
}

private fun totalPrice(n: Int) {
    var total = oilPrice[0] * road[0]

    var curOilPrice = oilPrice[0]
    for(i in 1 until n-1) {
        if(oilPrice[i] < curOilPrice) {
            curOilPrice = oilPrice[i]
        }
        total += curOilPrice * road[i]
    }

    println(total)
}

 

728x90

댓글