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

[Swift Algorithm] 계단 였λ₯΄κΈ° BOJ #2579

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

계단 였λ₯΄κΈ° κ²Œμž„μ€ 계단 μ•„λž˜ μ‹œμž‘μ λΆ€ν„° 계단 κΌ­λŒ€κΈ°μ— μœ„μΉ˜ν•œ λ„μ°©μ κΉŒμ§€ κ°€λŠ” κ²Œμž„μ΄λ‹€. <κ·Έλ¦Ό 1>κ³Ό 같이 각각의 κ³„λ‹¨μ—λŠ” μΌμ •ν•œ μ μˆ˜κ°€ μ“°μ—¬ μžˆλŠ”λ° 계단을 밟으면 κ·Έ 계단에 μ“°μ—¬ μžˆλŠ” 점수λ₯Ό μ–»κ²Œ λœλ‹€.

<κ·Έλ¦Ό 1>

예λ₯Ό λ“€μ–΄ <κ·Έλ¦Ό 2>와 같이 μ‹œμž‘μ μ—μ„œλΆ€ν„° 첫 번째, 두 번째, λ„€ 번째, μ—¬μ„― 번째 계단을 λ°Ÿμ•„ 도착점에 λ„λ‹¬ν•˜λ©΄ 총 μ μˆ˜λŠ” 10 + 20 + 25 + 20 = 75점이 λœλ‹€.

<κ·Έλ¦Ό 2>

계단 였λ₯΄λŠ” λ°λŠ” λ‹€μŒκ³Ό 같은 κ·œμΉ™μ΄ μžˆλ‹€.

  1. 계단은 ν•œ λ²ˆμ— ν•œ 계단씩 λ˜λŠ” 두 계단씩 였λ₯Ό 수 μžˆλ‹€.
    즉, ν•œ 계단을 λ°ŸμœΌλ©΄μ„œ μ΄μ–΄μ„œ λ‹€μŒ κ³„λ‹¨μ΄λ‚˜, λ‹€μŒ λ‹€μŒ κ³„λ‹¨μœΌλ‘œ 였λ₯Ό 수 μžˆλ‹€.
  2. μ—°μ†λœ μ„Έ 개의 계단을 λͺ¨λ‘ λ°Ÿμ•„μ„œλŠ” μ•ˆ λœλ‹€. 단, μ‹œμž‘μ μ€ 계단에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.
  3. λ§ˆμ§€λ§‰ 도착 계단은 λ°˜λ“œμ‹œ λ°Ÿμ•„μ•Ό ν•œλ‹€.

λ”°λΌμ„œ 첫 번째 계단을 밟고 이어 두 번째 κ³„λ‹¨μ΄λ‚˜, μ„Έ 번째 κ³„λ‹¨μœΌλ‘œ 였λ₯Ό 수 μžˆλ‹€. ν•˜μ§€λ§Œ, 첫 번째 계단을 밟고 이어 λ„€ 번째 κ³„λ‹¨μœΌλ‘œ μ˜¬λΌκ°€κ±°λ‚˜, 첫 번째, 두 번째, μ„Έ 번째 계단을 μ—°μ†ν•΄μ„œ λͺ¨λ‘ λ°Ÿμ„ μˆ˜λŠ” μ—†λ‹€.

각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ 이 κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총 점수의 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

μž…λ ₯의 첫째 쀄에 κ³„λ‹¨μ˜ κ°œμˆ˜κ°€ 주어진닀.

λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 제일 μ•„λž˜μ— 놓인 계단뢀터 μˆœμ„œλŒ€λ‘œ 각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ 주어진닀. κ³„λ‹¨μ˜ κ°œμˆ˜λŠ” 300μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄κ³ , 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜λŠ” 10,000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 계단 였λ₯΄κΈ° κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총 점수의 μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.

 

μž…μΆœλ ₯ 예제

μž…λ ₯

6
10
20
15
25
10
20

좜λ ₯

75

 

λ‚΄ 문제 풀이
let n = Int(readLine()!)!
var arr1 = Array(repeating: 0, count: n) // 직전 계단 λ°Ÿμ€ 경우 λ°°μ—΄
var arr2 = Array(repeating: 0, count: n) // 직전 계단 λ°Ÿμ§€ μ•Šμ€ 경우 λ°°μ—΄

for i in 0..<n {
    let now = Int(readLine()!)!
    
    // 직전 계단을 λ°Ÿμ•˜λ‹€κ³  ν•  λ•Œ
    if i == 0 { arr1[i] = now }
    else { arr1[i] = now + arr2[i-1] }
    
    // 직전 계단을 λ°Ÿμ§€ μ•Šμ•˜λ‹€κ³  ν•  λ•Œ
    if i < 2 { arr2[i] = now }
    else { arr2[i] = now + max(arr1[i-2], arr2[i-2]) }
}

print(max(arr1[n-1], arr2[n-1]))

πŸ‘‰ DP 문제둜, 직전 계단을 λ°Ÿμ•˜μ„ κ²½μš°μ™€ λ°Ÿμ§€ μ•Šμ•˜μ„ 경우둜 λ‚˜λˆ μ„œ λ©”λͺ¨μ΄μ œμ΄μ…˜ ν•΄μ£ΌλŠ”κ²Œ 포인트!

 

[λ³€μˆ˜ μ„€λͺ…]

  • n : μž…λ ₯받은 계단 수
  • arr1 : 직전 계단을 λ°Ÿμ€ 경우의 μ—°μ‚° 값을 μ €μž₯ν•  λ°°μ—΄
  • arr2 : 직전 계단을 λ°Ÿμ§€ μ•Šμ€ 경우의 μ—°μ‚° 값을 μ €μž₯ν•  λ°°μ—΄

[풀이 μ„€λͺ…]

  • 직전 계단을 λ°Ÿμ•˜λ‹€κ³  μΉœλ‹€λ©΄, μ „μ „ 계단은 λ°Ÿμ§€ μ•Šμ•˜λ‹€λŠ” κ²ƒμœΌλ‘œ 해석할 수 μžˆλ‹€.
    => arr2 λ°°μ—΄μ˜ 직전 μœ„μΉ˜ λˆ„μ  값에, ν˜„μž¬ κ³„λ‹¨μ˜ 값을 λ”ν•΄μ„œ μ €μž₯ν•΄μ£Όλ©΄ λœλ‹€.
    (arr1 λ°°μ—΄μ˜ 직전 μœ„μΉ˜ 값을 μ €μž₯ν•˜λ©΄ μ•ˆλœλ‹€.
    κ·Έ μ΄μœ λŠ”, arr1은 직전 계단을 λ°Ÿμ•˜μ„ λ•Œλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄μ΄λ―€λ‘œ
    arr1 λ°°μ—΄μ˜ 직전 μœ„μΉ˜ 값은 또 κ·Έ λ°”λ‘œ 직전 계단을 λ°Ÿμ•˜λ‹€λŠ” 의미이기 λ•Œλ¬Έμ΄λ‹€.
    λ¬Έμ œμ—μ„œ 3연속 계단 λ°ŸκΈ°λŠ” μ•ˆλœλ‹€κ³  ν–ˆμœΌλ―€λ‘œ arr2 λ°°μ—΄μ˜ 직전 μœ„μΉ˜ 값을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.)
  • 직전 계단을 λ°Ÿμ§€ μ•Šμ•˜λ‹€κ³  μΉœλ‹€λ©΄, μ „μ „ 계단을 밟고써 μ˜¬λΌμ™”λ‹€λŠ” κ²ƒμœΌλ‘œ 해석할 수 μžˆλ‹€.
    => arr1κ³Ό arr2의 μ „μ „ μœ„μΉ˜  λˆ„μ  κ°’ 쀑 더 큰수λ₯Ό 골라 λ”ν•΄μ„œ μ €μž₯ν•΄μ£Όλ©΄ λœλ‹€.

[μ½”λ“œ μ„€λͺ…]

  • 반볡문으둜 첫 번째 계단뢀터 λ°›μ•„μ˜€λ©΄μ„œ λ°”λ‘œλ°”λ‘œ μ—°μ‚°ν•΄μ£Όμ—ˆλ‹€.
  • arr1 λ¨Όμ € 값을 ν• λ‹Ήν•΄λ³΄μž.
    arr1은 직전 계단을 λ°Ÿμ•˜λ‹€κ³  ν•˜λŠ” 경우인데, 첫 번째 계단일 κ²½μš°μ—λŠ” 직전 계단이 μ—†μœΌλ―€λ‘œ
    i == 0 일 λ•ŒλŠ” arr1 λ°°μ—΄ ν•΄λ‹Ή μœ„μΉ˜μ— ν˜„μž¬ 계단 점수λ₯Ό κ·ΈλŒ€λ‘œ μ €μž₯ν–ˆλ‹€.
    κ·Έ μ™Έμ˜ κ²½μš°μ—λŠ” arr1의 i μœ„μΉ˜μ— (ν˜„μž¬ 계단 점수 + arr2의 직전 λˆ„μ  κ°’)을 μ €μž₯ν–ˆλ‹€.
  • arr2 값을 ν• λ‹Ήν•΄λ³΄μž.
    arr2λŠ” μ „μ „ 계단을 λ°Ÿμ•˜λ‹€κ³  ν•˜λŠ” 경우인데, 첫 λ²ˆμ§Έμ™€ 두 번째 계단일 κ²½μš°μ—” λΆˆκ°€ν•˜λ‹€.
    λ”°λΌμ„œ i < 2 일 λ•ŒλŠ” arr2 λ°°μ—΄ ν•΄λ‹Ή μœ„μΉ˜μ— ν˜„μž¬ 계단 점수λ₯Ό κ·ΈλŒ€λ‘œ μ €μž₯ν–ˆλ‹€.
    κ·Έ μ™Έμ˜ κ²½μš°μ—λŠ” arr1κ³Ό arr2의 μ „μ „ μœ„μΉ˜ λˆ„μ κ°’ 쀑 더 큰 수λ₯Ό 골라 ν˜„μž¬ 계단값에 λ”ν–ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • μ²˜μŒμ—” μž¬κ·€λ‘œ λͺ¨λ“  경우의 수λ₯Ό ν™•μΈν•΄μ£Όμ—ˆλŠ”λ°, μ‹œκ°„μ΄ˆκ³Όκ°€ 났닀.
  • 이 λ¬Έμ œκ°™μ΄ λ”± λͺ‡ κ°€μ§€μ˜ μΌ€μ΄μŠ€λ‘œ 닡을 κ΅¬ν•˜λŠ”κ²Œ κ°€λŠ₯ν•  κ²½μš°μ—λŠ”
    무쑰건 DP둜 풀이해야 νš¨μœ¨μ„±μ„ 높일 수 μžˆλŠ” 것 κ°™λ‹€.
  • 문제λ₯Ό μ΄ν•΄ν•˜κ³ , μ–΄λ– ν•œ μΌ€μ΄μŠ€λ‘œ λ‚˜λˆŒ 수 μžˆλŠ”μ§€ μ •ν™•νžˆ νŒŒμ•…ν•  수 μžˆμ–΄μ•Ό ν•  것 κ°™λ‹€.

 


문제

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

λŒ“κΈ€