๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1446
๐ ๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ
์ฒ์์ ๋ด๊ฐ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์, 2์ฐจ์ dp ์๋ค. ์ด๋ ๊ฒ ๋๊ฐ์ง ๋ฐ๊ณ ๋๊ฐ์ด๋ ํ๋ฆด๊ฑฐ ๊ฐ๊ธดํ๋ค. ๊ทผ๋ฐ, ์ ์๊พธ ์๊ฐ์ด ๋งํ์ง?
์ฒ์์๋ ์ด๋ ๊ฒ 2์ฐจ์ dp๋ก ๋ฌธ์ ๋ฅผ ํ๋ ค๊ณ ํ๋ค. ๊ทผ๋ฐ ๊ตณ์ด ์์์์น๋ฅผ ํํํ๋ฉด์ ๋ฐฐ์ด์ ๊ฑฐ๋ํ๊ฒ ๋ง๋ค ํ์๊ฐ ์๋ค๊ณ ํ๋จ๋์๋ค. ์ด์ฐจํผ ๋์ฐฉ์์น์์ shortcut์ ๊ตฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์,, ๊ตณ์ด ์์์์น๊น์ง ๊ธฐ์ตํด์ผํ ํ์๊ฐ ์์๊น? ๊ทธ๋์ ๊ทธ๋ฅ 1์ฐจ์ ๋ฐฐ์ด๋ก ํ์ด์ผ๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
๊ทธ๋์ ํ๋จํ๊ฒ ์ด๋ ๊ฒ!
distance[์์น] ์๋ค๊ฐ ์ต์๊ฑฐ๋ฆฌ๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ต์๊ฑฐ๋ฆฌ๋ ์ด๋ป๊ฒ ํ๋ณํ ๊ฒ์ด๋? ๋ง์ฝ shortcut์ด ์๋ค๋ฉด, ํด๋น ์ธ๋ฑ์ค ๊น์ง์ ๊ฑฐ๋ฆฌ๋ ์ธ๋ฑ์ค ๋ฒํธ์ ์ผ์นํ๋ค. ๊ทธ๋์ ์ผ๋จ distance ๋ฐฐ์ด์๋ค๊ฐ 1~D๊น์ง ์ ๋ถ ๋ฃ์ด์ฃผ์๋ค.
์ง๊ธ๊น์ง๋ distance์ ๊ทธ๋ฅ 1๋ถํฐ ์ฐจ๋ก๋๋ก ๋ค์ด๊ฐ์๋ค. ๊ทผ๋ฐ ์ ์์ 1 ์์ ์ฒ๋ผ, ๋ง์ฝ end point๊ฐ 50์ธ ๊ณณ์ shortcut์ด ์กด์ฌํ๋ค๋ฉด, distance[50]์ 50์ด ์๋๋ผ, 10์ผ๋ก ๋ฐ๊ฟ์ฃผ์ด์ผํ๋ค. ์ด ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค๋ฉด, distance[50]์ ์์นํ ์ต์๊ฑฐ๋ฆฌ๋
distance[49]+1 vs. distance[50]๊ฐ ๋๋ค!
๊ทธ๋ฌ๋ฉด, ์ฌ๊ธฐ์ ๋ด๊ฐ ์ธ์ธ ์ ์๋ ๋ก์ง์
- ๋จผ์ distance์ 1๋ถํฐ d๊น์ง ๋ฃ์ด์ฃผ๊ธฐ
- ๋์ฐฉ์์น๊ฐ, shortcut์ด ์กด์ฌํ๋ endpoint๋ผ๋ฉด shortcut๋ฃ์ด์ฃผ๊ธฐ
- ์์์์น๋ก๋ถํฐ ๋น๊ตํด์ผํจ. ๋ด๊ฐ ์ง๊ธ 0์ ์์ ๋, 0์ด startpoint์ ์กด์ฌํ๋ค๋ฉด, endpoint์ shortcut์ distance[startpoint] + shortcut์ผ๋ก !! ํด์ผํจ!! ๊ทธ๋์ผ shortcut์ด ๋ํด์ง ๊ฐ์ด ๋์น
๐ ์์ค์ฝ๋
๋๋ ํ๋์ ์ธํธ (start, end, shortcut) ์ ์ธ๋ฑ์ค ๋ฒํธ๋ก ์ด์ฉํ๊ธฐ ์ํด์ start, end, shortcut ๋ฐฐ์ด์ ๋ฐ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค!
let nd = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = nd[0]
let d = nd[1]
var start = [Int]()
var end = [Int]()
var shortcut = [Int]()
var distance = [Int]()
for i in 0..<d+1 {
distance.append(i)
}
for _ in 0..<n {
let temp = readLine()!.split(separator: " ").map { Int(String($0))! }
start.append(temp[0])
end.append(temp[1])
shortcut.append(temp[2])
}
for j in 0..<d+1 {
if j > 0 {
distance[j] = min(distance[j-1]+1, distance[j])
}
for k in 0..<start.count {
if j == start[k], end[k] <= d, distance[start[k]]+shortcut[k] < distance[end[k]] {
distance[end[k]] = distance[start[k]]+shortcut[k]
}
}
}
print(distance[d])