알고리즘/문제풀이

[백준] 13305번 주유소 - 파이썬(Python)

SeongOnion 2021. 7. 28. 00:56
728x90

문제 (링크)

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

 

13305번: 주유소

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

www.acmicpc.net

 

나의 풀이

n = int(input())
ans = 0
cities = list(map(int, input().split()))
prices = list(map(int, input().split()))

min_price = 1000000000
min_price_index = -1
for i in range(n-1):
    if prices[i] < min_price:
        min_price = prices[i]
        min_price_index = i

for i in range(n-1):
    if i == min_price_index:
        ans += (prices[i] * sum(cities[i:]))
        break
    
    else:
        ans += (prices[i] * cities[i])

print(ans)

풀이법 및 코드 설명

아이디어 자체는 금방 떠올릴 수 있었다.

 

가격 가장 적은 도시에서 최대한 많이 사고, 그 외의 도시에서는 당장 이동하는데 필요한 만큼만 사주면 되는 문제였다.

 

가격이 가장 적은 곳을 첫 번째 for문을 통해 찾아주었다. 아마 굳이 for문을 직접 작성해주는게 아닌 다른 함수를 호출해서 사용할 수도 있었겠지만, 당장 기억이 나지 않아서 그냥 for문으로 처리해줬다.

 

이후 두 번째 for문에서는 앞서 구한 최소 가격의 인덱스가 나오면 앞으로 필요한 기름을 모두 사고, 그렇지 않으면 당장 이동에 필요한 기름만 사도록 구현해주었다.

 

하지만 부분 점수만 받고 통과하지 못했다.

 

다른 풀이

n = int(input())
cities = list(map(int, input().split()))
prices = list(map(int, input().split()))

ans = 0
min_price = prices[0]

for i in range(n-1):
    if prices[i] < min_price:
        min_price = prices[i]

    ans += min_price * cities[i]

print(ans)

이전 코드처럼 최소 가격을 구하기 위해 따로 반복문을 도는 것이 아닌, 가격을 실제로 더하는 과정에서 최소 가격을 확인해줄 수 있다.