λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Problem Solving

[Swift Algorithm] μ£Όμœ μ†Œ BOJ #13305

by seolhee2750 2021. 8. 19.
문제 μ„€λͺ…

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

 

좜λ ₯

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

 

μž…μΆœλ ₯ 예제

μž…λ ₯

4
2 3 1
5 2 4 1

좜λ ₯

18

 

λ‚΄ 문제 풀이
import Foundation

let N = Int(readLine()!)!
let distance = readLine()!.split(separator: " ").map({Int(String($0))!})
let city = readLine()!.split(separator: " ").map({Int(String($0))!})
var min = city[0]
var price = city[0] * distance[0]
var d = 0

for i in 1..<city.count-1 {
    d += 1
    if city[i] < min { min = city[i] }
    price += min * distance[d]
}

print(price)

πŸ‘‰ ν•œ λ„μ‹œμ—μ„œ λ‹€μŒ λ„μ‹œλ‘œ λ„˜μ–΄κ°ˆ λ•Œλ§ˆλ‹€, μ΅œμ†Œ 기름값을 κ°±μ‹ ν•΄μ£Όλ©°

λ„μ‹œ...λ„μ‹œ κ±°λ¦¬λ§ˆλ‹€ μ΅œμ†Œ 기름값을 κ³±ν•΄μ€€ 값을 λˆ„μ ν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ ν’€μ΄ν–ˆλ‹€.

  • μ΅œμ†Ÿκ°’κ³Ό 관계없이 첫 번째 λ„μ‹œμ—μ„œ μΆœλ°œν•  λ•ŒλŠ” μ–΄μ°¨ν”Ό 첫 번째 λ„μ‹œ κΈ°λ¦„κ°’μœΌλ‘œ μ£Όμœ ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ—,
    μš°μ„  price에 (첫 번째 λ„μ‹œ 기름값 * 첫 번째...두 번째 거리)λ₯Ό μ €μž₯ν•΄μ£Όμ—ˆλ‹€.
  • 첫 번째 λ„μ‹œμ—μ„œ ν•„μš”ν•œ 기름값은 이미 λˆ„μ ν–ˆκ³ , λ§ˆμ§€λ§‰ λ„μ‹œμ—μ„œλŠ” 더이상 μ£Όμœ ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ—
    1..<city.count-1둜 for문의 λ²”μœ„λ₯Ό μ§€μ •ν•΄μ£Όμ—ˆλ‹€.
  • λ‹€μŒ λ„μ‹œλ‘œ λ„˜μ–΄μ™”μ„ λ•Œ, 이전 λ„μ‹œλ³΄λ‹€ 기름값이 적닀면 min을 μ—…λ°μ΄νŠΈν•΄μ£Όμ—ˆλ‹€.
  • priceμ—λŠ” μ—…λ°μ΄νŠΈλœ minκ°’κ³Ό ν•΄λ‹Ή λ„μ‹œμ—μ„œ λ‹€μŒ λ„μ‹œλ‘œ μ΄μ–΄μ§€λŠ” 거리λ₯Ό κ³±ν•˜μ—¬ λˆ„μ ν•΄μ£Όμ—ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • μ²˜μŒμ—” 가격, 거리 λ“± μƒκ°ν• κ²Œ λ§Žμ•„λ³΄μ˜€λ˜ λ¬Έμ œμ§€λ§Œ, κ·Έλƒ₯ κΈ°λ¦„κ°’μ˜ μ΅œμ†Œλ§Œ κ³ λ €ν•΄μ£Όλ©΄ λ˜λŠ” κ°„λ‹¨ν•œ λ¬Έμ œμ˜€λ‹€.

 


 

문제

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

λŒ“κΈ€