[BOJ] 13305번 | μ£Όμœ μ†Œ (Python3)

2022. 7. 14. 16:17ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

13305번: μ£Όμœ μ†Œ

ν‘œμ€€ μž…λ ₯으둜 λ‹€μŒ 정보가 주어진닀. 첫 번째 μ€„μ—λŠ” λ„μ‹œμ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N(2 ≤ N ≤ 100,000)이 주어진닀. λ‹€μŒ μ€„μ—λŠ” μΈμ ‘ν•œ 두 λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œμ˜ 길이가 제일 μ™Όμͺ½ λ„λ‘œλΆ€ν„° N-1

www.acmicpc.net

 

 

문제 μ„€λͺ…

μ–΄λ–€ λ‚˜λΌμ— 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 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€. 

 


좜λ ₯

ν‘œμ€€ 좜λ ₯으둜 제일 μ™Όμͺ½ λ„μ‹œμ—μ„œ 제일 였λ₯Έμͺ½ λ„μ‹œλ‘œ κ°€λŠ” μ΅œμ†Œ λΉ„μš©μ„ 좜λ ₯ν•œλ‹€.

 


μ„œλΈŒνƒœμŠ€ν¬

 


예제 μž…μΆœλ ₯

 


풀이 μ „λž΅

λ„μ‹œ κ°œμˆ˜μ™€ 거리, 기름값이 ꡉμž₯히 큰 μˆ˜κ°€ λ‚˜μ˜¬ μˆ˜λ„ μžˆμ–΄μ„œ μ˜€λ²„ν”Œλ‘œμš°(overflow)λ₯Ό κ±±μ •ν–ˆλŠ”λ°, Python3의 μ •μˆ˜ν˜• λ²”μœ„μ— μ œν•œμ΄ μ—†λ”κ΅°μš”. κ·Έλž˜μ„œ 별 걱정없이 κ·ΈλŒ€λ‘œ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” λ‹€μŒκ³Ό 같이 ν’€μ—ˆμŠ΅λ‹ˆλ‹€.

  • μž…λ ₯받을 λ•Œ, λͺ¨λ“  거리의 총합과 κ°€μž₯ κ°’ μ‹Ό 기름 값을 λ³„λ„λ‘œ μ €μž₯ν•΄λ‘”λ‹€.
  • ν˜„μž¬ λ‚΄κ°€ 머무λ₯΄λŠ” λ„μ‹œμ˜ 기름값  ≤  λ‹€μŒ λ„μ‹œμ˜ 기름값
    • λ‹€μŒ λ„μ‹œκΉŒμ§€ 거리만큼의 기름을 κ΅¬λ§€ν•œλ‹€.
    • 이동 거리에 λ‹€μŒ λ„μ‹œκΉŒμ§€μ˜ κ±°λ¦¬λ§ŒνΌμ„ μΆ”κ°€ν•œλ‹€.
    • κ·Έ λ‹€μŒ λ„μ‹œμ˜ 기름 값을 μ‚΄νŽ΄λ³Έλ‹€.
    • κ·Έ λ‹€μŒ λ„μ‹œ μ—­μ‹œ λΉ„μ‹Έλ‹€λ©΄ μœ„ κ³Όμ • 반볡
  • ν˜„μž¬ λ‚΄κ°€ 머무λ₯΄λŠ” λ„μ‹œμ˜ 기름값  >  λ‹€μŒ λ„μ‹œμ˜ 기름값
    • λ‹€μŒ λ„μ‹œκΉŒμ§€ 거리만큼의 기름을 κ΅¬λ§€ν•œλ‹€.
    • 이동 거리에 λ‹€μŒ λ„μ‹œκΉŒμ§€μ˜ κ±°λ¦¬λ§ŒνΌμ„ μΆ”κ°€ν•œλ‹€.
    • λͺ¨λ“  거리의 μ΄ν•©μ—μ„œ μ΄λ™ν•œλ§ŒνΌμ˜ 거리λ₯Ό λΊ€λ‹€.
    • 이동 거리λ₯Ό 0으둜 λ‹€μ‹œ μ΄ˆκΈ°ν™”ν•œλ‹€.
  • λ§ˆμ§€λ§‰ λ„μ‹œμ˜ μ „ λ„μ‹œμ— λ„μ°©ν–ˆλ‹€λ©΄ 남은 거리만큼 기름을 사면 끝
  • λ§Œμ•½ 쀑간에 기름이 κ°€μž₯ μ‹Ό λ„μ‹œμ— λ„μ°©ν–ˆλ‹€λ©΄, 남은 총 거리만큼 기름을 사고 끝

μ‹œλ‚˜λ¦¬μ˜€

  • 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 λ„μ‹œ 5κ°œκ°€ μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •ν•©μ‹œλ‹€.
  • μž…λ ₯ 받을 λ•Œ, μ΄ 거리의 ν•©κ³Ό μ œμΌ μ‹Ό 기름값을 λ³„λ„λ‘œ μ €μž₯ν•΄λ‘‘λ‹ˆλ‹€.

  • 두 번째 λ„μ‹œλ₯Ό μ‚΄νŽ΄λ³΄λ‹ˆ ν˜„μž¬ λ„μ‹œλ³΄λ‹€ 기름 값이 λΉ„μŒ‰λ‹ˆλ‹€. λ‘ 번째 λ„μ‹œκΉŒμ§€μ˜ 기름을 κ΅¬λ§€ν•˜κ³ , μ΄λ™ 거리λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

  • κ·Έ λ‹€μŒ λ„μ‹œλ„ μ‚΄νŽ΄λ³΄λ‹ˆ μ—­μ‹œ λΉ„μŒ‰λ‹ˆλ‹€. λ‘ 번째 λ„μ‹œμ—μ„œ μ„Έ 번째 λ„μ‹œ μ‚¬μ΄μ˜ 거리만큼 기름 값을 κ΅¬λ§€ν•˜κ³  κ±°λ¦¬λ„ μ €μž₯ν•΄μ€λ‹ˆλ‹€.

  • λ„€ 번째 λ„μ‹œλ₯Ό μ‚΄νŽ΄λ³΄λ‹ˆ, ν˜„μž¬ λ„μ‹œλ³΄λ‹€ 기름 값이 μŒ‰λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ„€ 번째 λ„μ‹œλ‘œ κ°€κΈ° μœ„ν•΄μ„œλŠ” μ„Έ 번째 λ„μ‹œμ™€ λ„€ 번째 λ„μ‹œ μ‚¬μ΄μ˜ 거리만큼 기름도 ν•„μš”ν•˜λ―€λ‘œ κ΅¬λ§€ν•΄μ€λ‹ˆλ‹€.
  • 첫 번째 λ„μ‹œμ—μ„œ λ„€ 번째 λ„μ‹œκΉŒμ§€ κ°€λŠ”λ° κ±Έλ¦¬λŠ” 거리λ₯Ό μ΄ κ±°λ¦¬μ—μ„œ λΉΌμ€λ‹ˆλ‹€. ( 12 - 7 = 5km)
  • 이동 거리λ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•΄μ€λ‹ˆλ‹€.

  • λ„€ 번째 λ„μ‹œμ— μ™€λ³΄λ‹ˆ μ‹œλ‚˜λ¦¬μ˜€ μ’…λ£Œ 쑰건 두 개λ₯Ό λͺ¨λ‘ λ§Œμ‘±ν•©λ‹ˆλ‹€.
    • λ§ˆμ§€λ§‰ μ „ λ„μ‹œκΉŒμ§€ 온 상황일 경우
    • 제일 κ°’ μ‹Ό 기름 값을 λ³΄μœ ν•˜κ³  μžˆλŠ” λ„μ‹œμΌ 경우
  • λ‘˜ 쀑 ν•˜λ‚˜λ§Œ λ§Œμ‘±ν•΄λ„ 되고, λ‘˜ 쀑 μ–΄λŠ κ±Έ ν•˜λ”λΌλ„ λ˜‘κ°™μ€ κ²°κ³Όμ΄λ―€λ‘œ μ§„ν–‰ν•΄μ€λ‹ˆλ‹€.

 

이둜써 μ΅œμ†Œ λΉ„μš© 50μ›λ§ŒνΌλ§Œ 기름을 κ΅¬λ§€ν•˜λ©΄ 이동을 μ™„λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ 쀑간에 제일 μ‹Ό 기름 값을 κ°€μ§€λŠ” λ„μ‹œλ₯Ό λ§Œλ‚˜κ²Œ 되면 μ–΄λ–»κ²Œ λ κΉŒμš”?

 

쀑간에 제일 κ°’ μ‹Ό κΈ°λ¦„κ°’μ˜ λ„μ‹œλ₯Ό λ§Œλ‚  경우

  • μœ„ μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ 두 번째 λ„μ‹œμ™€ λ„€ 번째 λ„μ‹œλ§Œ λ°”κΏ”λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

  • ν˜„μž¬ λ„μ‹œμ—μ„œ λ‹€μŒ λ„μ‹œλ₯Ό λ³΄λ‹ˆ, ν˜„μž¬ λ„μ‹œλ³΄λ‹€ 기름값이 μŒ‰λ‹ˆλ‹€λ‹€μŒ λ„μ‹œκΉŒμ§€ 거리만큼의 κΈ°λ¦„λ§Œ κ΅¬λ§€ν•˜κ³ , μ΄ κ±°λ¦¬μ—μ„œ ν•΄λ‹Ή 거리λ₯Ό λΉΌμ€μ‹œλ‹€.

  • 두 번째 λ„μ‹œμ— 와 λ³΄λ‹ˆ, μ œμΌ 기름 값이 μ‹Ό λ„μ‹œμž…λ‹ˆλ‹€. μ΄ 경우 남은 총 거리만큼 μ—¬κΈ°μ„œ 기름을 κ΅¬λ§€ν•˜λ©΄ λ˜λ―€λ‘œ, 뒀에 남은 λ„μ‹œλ“€μ€ μ‚΄νŽ΄λ³Ό ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

이둜써, 기름 값을 μ΅œμ†Œλ‘œ 40μ›λ§Œ 듀이면 λͺ¨λ“  λ„μ‹œλ₯Ό 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

 


μ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

# Python3λŠ” μ •μˆ˜ λ²”μœ„κ°€ λ¬΄μ œν•œ

N = int(input())           # λ„μ‹œμ˜ 개수 (2 <= N <= 100000)
distances = list(map(int, input().split()))
oilCosts = list(map(int, input().split()))
totalDistance = sum(distances)
minOilCost = min(oilCosts)

#---------------------------------------------------------------------

def Solution(distances, totalDistance, oilCosts, minOilCost):
    i = 0
    totalOilCost = 0
    
    while i < N - 1:                           # λ§ˆμ§€λ§‰ λ„μ‹œ μ „κΉŒμ§€λ§Œ μ²΄ν¬ν•˜λ©΄ 됨
        currentOilCost = oilCosts[i]
        isNextLastCity = (i == N - 2)
        moveDistance = 0
    
        if isNextLastCity:                     # λ§ˆμ§€λ§‰ μ „ λ„μ‹œκΉŒμ§€ μ™”λ‹€λ©΄ κ·Έ λ„μ‹œμ—μ„œ 남은 거리만큼 기름 사면 끝
            totalOilCost += currentOilCost * totalDistance
            return totalOilCost
    
        while oilCosts[i+1] >= currentOilCost: # λ‹€μŒ λ„μ‹œ 기름값이 ν˜„μž¬ λ‚΄κ°€ 머무λ₯΄λŠ” λ„μ‹œ 기름값보닀 λΉ„μŒ€ 경우
            betweenDistance = distances[i]     # ν˜„μž¬ λ„μ‹œ 기름값보닀 κ°’ μ‹Ό λ„μ‹œκ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ μ΄λ™ν• λ§ŒνΌμ˜ 기름을 ν˜„μž¬ λ„μ‹œμ—μ„œ ꡬ맀
            moveDistance += betweenDistance
            totalOilCost += currentOilCost * betweenDistance
            i += 1
        
            if i == N - 2:
                break
        
        # 기름값이 μ‹Ό λ„μ‹œμ™€ κ·Έ 이전 λ„μ‹œ μ‚¬μ΄μ˜ 거리만큼 기름 ꡬ맀가 whileλ¬Έ 쑰건에 μ˜ν•΄ μƒλž΅λμœΌλ―€λ‘œ 진행
        betweenDistance = distances[i]
        moveDistance += betweenDistance
        totalOilCost += currentOilCost * betweenDistance
        totalDistance -= moveDistance
        i += 1
    
        if oilCosts[i] == minOilCost:   # 제일 κ°’ μ‹Ό μ£Όμœ μ†Œλ₯Ό μ°Ύμ•˜λ‹€λ©΄ 남은 거리만큼 사고 끝
            totalOilCost += minOilCost * totalDistance
            return totalOilCost
    


result = Solution(distances, totalDistance, oilCosts, minOilCost)
print(result)

 

 

 

 

728x90
λ°˜μ‘ν˜•