3️⃣ Swift/Problem Solving

[Swift Algorithm] RGB거리 BOJ #1149

seolhee2750 2021. 10. 20. 18:06
문제 μ„€λͺ…

RGBκ±°λ¦¬μ—λŠ” 집이 N개 μžˆλ‹€. κ±°λ¦¬λŠ” μ„ λΆ„μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 있고, 1번 μ§‘λΆ€ν„° N번 집이 μˆœμ„œλŒ€λ‘œ μžˆλ‹€.

집은 λΉ¨κ°•, 초둝, νŒŒλž‘ 쀑 ν•˜λ‚˜μ˜ μƒ‰μœΌλ‘œ μΉ ν•΄μ•Ό ν•œλ‹€. 각각의 집을 λΉ¨κ°•, 초둝, νŒŒλž‘μœΌλ‘œ μΉ ν•˜λŠ” λΉ„μš©μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ•„λž˜ κ·œμΉ™μ„ λ§Œμ‘±ν•˜λ©΄μ„œ λͺ¨λ“  집을 μΉ ν•˜λŠ” λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•΄λ³΄μž.

  • 1번 μ§‘μ˜ 색은 2번 μ§‘μ˜ 색과 κ°™μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.
  • N번 μ§‘μ˜ 색은 N-1번 μ§‘μ˜ 색과 κ°™μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.
  • i(2 ≤ i ≤ N-1)번 μ§‘μ˜ 색은 i-1번, i+1번 μ§‘μ˜ 색과 κ°™μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

 

μž…λ ₯

첫째 쀄에 μ§‘μ˜ 수 N(2 ≤ N ≤ 1,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 집을 λΉ¨κ°•, 초둝, νŒŒλž‘μœΌλ‘œ μΉ ν•˜λŠ” λΉ„μš©μ΄ 1번 μ§‘λΆ€ν„° ν•œ 쀄에 ν•˜λ‚˜μ”© μ£Όμ–΄μ§„λ‹€. 집을 μΉ ν•˜λŠ” λΉ„μš©μ€ 1,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 λͺ¨λ“  집을 μΉ ν•˜λŠ” λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

 

μž…μΆœλ ₯ 예제

μž…λ ₯

3
26 40 83
49 60 57
13 89 99

좜λ ₯

96

 

λ‚΄ 문제 풀이
let n = Int(readLine()!)!
var red = Array(repeating: 0, count: n)
var green = Array(repeating: 0, count: n)
var blue = Array(repeating: 0, count: n)

for i in 0..<n {
    let now = readLine()!.split(separator: " ").map({Int(String($0))!})
    
    if i == 0 {
        red[0] = now[0]
        green[0] = now[1]
        blue[0] = now[2]
    }
    else {
        red[i] = min(green[i-1], blue[i-1]) + now[0]
        green[i] = min(red[i-1], blue[i-1]) + now[1]
        blue[i] = min(red[i-1], green[i-1]) + now[2]
    }
}

print(min(red.last!, green.last!, blue.last!))

πŸ‘‰ DP 문제둜, μ§‘ λ§ˆλ‹€ μ–΄λ–€ 색을 μΉ ν–ˆλ‹€λŠ” μ „μ œλ₯Ό λ°”νƒ•μœΌλ‘œ μ„Έ κ°€μ§€ 경우의 수λ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ”κ²Œ 포인트!

이 λ¬Έμ œλŠ” 이전에 ν’€μ—ˆλ˜ #2579 κ³„λ‹¨μ˜€λ₯΄κΈ° λ¬Έμ œμ™€ ν‘μ‚¬ν•˜λ―€λ‘œ, μ°Έκ³ !

 

[풀이 μ„€λͺ…]

  • 1, 2, 3 색이 μžˆλ‹€κ³  ν•˜κ³ , 각각 1을 κ³¨λžμ„ λ•Œ, 2, 그리고 3을 κ³¨λžλ‹€κ³  κ°€μ •ν•˜λŠ” 경우의 수λ₯Ό
    λ©”λͺ¨μ΄μ œμ΄μ…˜μœΌλ‘œ κΈ°λ‘ν•˜μ—¬ λ§ˆμ§€λ§‰μ— κ·Έ 쀑 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•΄μ£Όμ–΄μ•Όν•œλ‹€.
  • λŒ€ν‘œλ‘œ 1, 빨간색을 κ³¨λžλ‹€κ³  ν•˜λŠ” 경우의 수λ₯Ό λ”°μ Έλ³΄μž.
    μ–΄λ–€ 집을 λΉ¨κ°„μƒ‰μœΌλ‘œ μΉ ν•œλ‹€λŠ” 것은 λ°”λ‘œ 이전 집은 μ΄ˆλ‘μ΄λ‚˜ νŒŒλž‘μ„ κ³¨λžλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
    λ”°λΌμ„œ 1을 κ³ λ₯΄λŠ” 경우의 수λ₯Ό κΈ°λ‘ν•˜λŠ” red 배열에,
    green λ°°μ—΄κ³Ό blue λ°°μ—΄μ˜ 이전 μœ„μΉ˜ 쀑 더 μž‘μ€ 수λ₯Ό κ³¨λΌμ„œ λ”ν•˜μ—¬ μ €μž₯ν•΄μ£Όλ©΄ λœλ‹€.
  • λΉ¨κ°„μƒ‰λΏλ§Œ μ•„λ‹ˆλΌ 초둝, νŒŒλž‘μ˜ κ²½μš°μ—λ„ λ§ˆμ°¬κ°€μ§€λ‘œ μœ„μ˜ μ‹œν–‰κ³Ό 같이 λ°˜λ³΅ν•˜λ©΄ λœλ‹€.
  • 그리고 κ·Έ μ™Έλ‘œ, 첫 번째 집은 이전 μ§‘κ³Ό 비ꡐ할 수 μ—†μœΌλ―€λ‘œ, νŠΉλ³„ν•œ μ—°μ‚° 없이
    λ°”λ‘œ red, green, blue 배열에 λͺ¨λ‘ ν•΄λ‹Ή 색깔 값을 μ €μž₯ν•΄μ£Όλ©΄ λœλ‹€.

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

  • 각각 red, blue, 그리고 green을 κ³¨λžλ‹€κ³  ν•˜λŠ” 경우의 수λ₯Ό 담을 배열을 μƒμ„±ν–ˆλ‹€.
  • for 반볡으둜 μ§‘ λ§ˆλ‹€μ˜ 색깔 가격을 λ°›μ•„μ˜€λ©΄μ„œ λ°”λ‘œλ°”λ‘œ 연산을 μ§„ν–‰ν–ˆλ‹€.
  • iκ°€ 0일 경우, 첫 번째 집을 μ˜λ―Έν•˜λ―€λ‘œ 이 λ•ŒλŠ” 각 배열에 ν•΄λ‹Ή 가격을 κ·ΈλŒ€λ‘œ λ„£μ–΄μ£Όμ—ˆλ‹€.
  • κ·Έ μ™Έμ˜ κ²½μš°μ—λŠ” 각 μƒ‰κΉ”λ³„λ‘œ μœ„μ—μ„œ μ„€λͺ…ν•œ 풀이와같은 연산을 μ‹€ν–‰ν–ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • λ°”λ‘œ 전에 ν’€μ—ˆλ˜ λ¬Έμ œμ™€ 정말 μœ μ‚¬ν•΄μ„œ 금방 ν’€ 수 μžˆμ—ˆκ³ ,
    μ΄λŸ¬ν•œ μœ ν˜•μ˜ λ¬Έμ œκ°€ μžˆλ‹€λŠ” 것을 곡뢀할 수 μžˆμ—ˆλ‹€.
    λΉ„μŠ·ν•œ λ¬Έμ œλ“€μ„ 더 많이 풀어보면 μ΅μˆ™ν•΄μ§ˆ 수 μžˆμ„ 것 κ°™λ‹€.

 


문제

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