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

[Swift Algorithm] ATM BOJ #11399

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

μΈν•˜μ€ν–‰μ—λŠ” ATM이 1λŒ€λ°–μ— μ—†λ‹€. μ§€κΈˆ 이 ATMμ•žμ— Nλͺ…μ˜ μ‚¬λžŒλ“€μ΄ 쀄을 μ„œμžˆλ‹€. μ‚¬λžŒμ€ 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ 맀겨져 있으며, i번 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ Pi뢄이닀.

μ‚¬λžŒλ“€μ΄ 쀄을 μ„œλŠ” μˆœμ„œμ— λ”°λΌμ„œ, λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합이 λ‹¬λΌμ§€κ²Œ λœλ‹€. 예λ₯Ό λ“€μ–΄, 총 5λͺ…이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우λ₯Ό μƒκ°ν•΄λ³΄μž. [1, 2, 3, 4, 5] μˆœμ„œλ‘œ 쀄을 μ„ λ‹€λ©΄, 1번 μ‚¬λžŒμ€ 3λΆ„λ§Œμ— λˆμ„ 뽑을 수 μžˆλ‹€. 2번 μ‚¬λžŒμ€ 1번 μ‚¬λžŒμ΄ λˆμ„ 뽑을 λ•Œ κΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, 3+1 = 4뢄이 걸리게 λœλ‹€. 3번 μ‚¬λžŒμ€ 1번, 2번 μ‚¬λžŒμ΄ λˆμ„ 뽑을 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, 총 3+1+4 = 8뢄이 ν•„μš”ν•˜κ²Œ λœλ‹€. 4번 μ‚¬λžŒμ€ 3+1+4+3 = 11λΆ„, 5번 μ‚¬λžŒμ€ 3+1+4+3+2 = 13뢄이 걸리게 λœλ‹€. 이 κ²½μš°μ— 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합은 3+4+8+11+13 = 39뢄이 λœλ‹€.

쀄을 [2, 5, 1, 4, 3] μˆœμ„œλ‘œ 쀄을 μ„œλ©΄, 2번 μ‚¬λžŒμ€ 1λΆ„λ§Œμ—, 5번 μ‚¬λžŒμ€ 1+2 = 3λΆ„, 1번 μ‚¬λžŒμ€ 1+2+3 = 6λΆ„, 4번 μ‚¬λžŒμ€ 1+2+3+3 = 9λΆ„, 3번 μ‚¬λžŒμ€ 1+2+3+3+4 = 13뢄이 걸리게 λœλ‹€. 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ 합은 1+3+6+9+13 = 32뢄이닀. 이 방법보닀 더 ν•„μš”ν•œ μ‹œκ°„μ˜ 합을 μ΅œμ†Œλ‘œ λ§Œλ“€ μˆ˜λŠ” μ—†λ‹€.

쀄을 μ„œ μžˆλŠ” μ‚¬λžŒμ˜ 수 Nκ³Ό 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„ Piκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ ν•©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 μ‚¬λžŒμ˜ 수 N(1 ≤ N ≤ 1,000)이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” 각 μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„ Piκ°€ 주어진닀. (1 ≤ Pi ≤ 1,000)

 

좜λ ₯

첫째 쀄에 κ° μ‚¬λžŒμ΄ λˆμ„ μΈμΆœν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ˜ ν•©μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

 

μž…μΆœλ ₯ 예제

μž…λ ₯

5
3 1 4 3 2

좜λ ₯

32

 

λ‚΄ 문제 풀이
import Foundation

let num = Int(readLine()!)!
var line = readLine()!.split(separator: " ").map({Int(String($0))!})
var sum = 0

line.sort(by: >)

for i in 0..<num {
    sum += line[i] * (i+1) // 첫 번째 μ‚¬λžŒμ€ *num ~ λ§ˆμ§€λ§‰ μ‚¬λžŒμ€ *1
}

print(sum)

πŸ‘‰ λŒ€κΈ°μ‹œκ°„μ΄ κ°€μž₯ 짧은 μ‚¬λžŒλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ 쀄을 μ„œλŠ” 것이 κ°€μž₯ νš¨μœ¨μ μ΄λΌλŠ” 것이,, 포인트!

  • μž…λ ₯받은 λŒ€κΈ° μ‹œκ°„λ“€μ„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν–ˆλ‹€.
    λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ μ΄μœ λŠ”, ꡳ이 for문을 λ°˜λŒ€λ‘œ λŒλ¦¬λŠ” 수고λ₯Ό ν•˜μ§€ μ•Šμ•„λ„
    맨 μ•žμ—μ„œλΆ€ν„° κ°€μž₯ 큰 μˆ˜μ—λŠ” *num, 맨 λ’€ κ°€μž₯ μž‘μ€ μˆ˜μ—λŠ” *1 ν•΄ 쀄 수 있기 λ•Œλ¬Έ!
  • μœ„μ™€κ°™μ΄ κ³±ν•˜λŠ” μ΄μœ λŠ”, λŒ€κΈ°μ€„μ˜ 첫 번째 μ‚¬λžŒμ˜ 경우 본인의 λŒ€κΈ°μ‹œκ°„λ§ŒνΌλ§Œ κΈ°λ‹€λ¦¬λ©΄λ˜κ³ 
    두 번째 μ‚¬λžŒλΆ€ν„°λŠ” μ•ž μ‚¬λžŒμ˜ λŒ€κΈ° μ‹œκ°„, 또 κ·Έ μ•žμ‚¬λžŒμ˜ λŒ€κΈ°μ‹œκ°„..을 λͺ¨λ‘ κΈ°λ‹€λ €μ•Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • λŒ€κΈ°μ‹œκ°„μ΄ μ§§μ„μˆ˜λ‘ μ•žμ— μ„œλ©΄ λœλ‹€λŠ” κ²ƒλ§Œ μ•Œλ©΄ 금방 ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€.

 


 

문제

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

λŒ“κΈ€