Problem
Solution
ํด๋น ๋ฌธ์ ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํ์ด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
1. ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ ์ต๋์น๋ฅผ ๊ตฌํด์ค๋ค.
๋ฌธ์ ๋ฅผ ๋ชจ๋ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ ์ต๋์น๋ฅผ ์ป๋ ๋ค๋ ๊ฒ์ด๋ฏ๋ก ๋ฏธ๋ฆฌ ๊ตฌํด์ค๋ค.
var maxAlp: Int = alp
var maxCop: Int = cop
problems.forEach {
maxAlp = max(maxAlp,$0[0])
maxCop = max(maxCop,$0[1])
}
2. dp ๋ฐฐ์ด์ ์๊ณ ๋ ฅ + 1 , ์ฝ๋ฉ๋ ฅ + 1๊ฐ์ ์ด์ค ๋ฐฐ์ด์ ๋ง๋ค์ด ์ค๋ค.
๊ฐ ๋ฐฐ์ด์ ๊ฐ์ ๋ฌด๋ํ ํฐ ๊ฐ(?)์ผ๋ก ์ค์ ํด ์ค๋ค. (Int.max๋ฅผ ํ๊ฒ ๋๋ฉด ๋ค์ ํด๋น ๊ฐ์ +1์ ํด์ค ๋ ์ค๋ฅ๊ฐ ๋จ)
๊ฐ์ฅ ์ด๊ธฐ๊ฐ์ 0์ผ๋ก ์ค์ ํด ์ค๋ค.
var dp: [[Int]] = Array(repeating:Array(repeating:10000,count:maxCop+1),count:maxAlp+1)
dp[alp][cop] = 0
3. ์ต๋ ์๊ณ ๋ ฅ๊ณผ ์ต๋ ์ฝ๋ฉ๋ ฅ๊น์ง dp์ ๊ฐ์ +1 ํ์ฌ ๋น๊ตํ๋ค.
dp์ ๊ฐ์ 1์ฉ ๋๋ ค๊ฐ ์ฃผ๋ฉฐ ๋ ์์ ๊ฐ์ผ๋ก ํ์ฌ ๊ฐ์ ๊ฐฑ์ ํด ์ค๋ค.
for currentAlp in alp...maxAlp {
for currentCop in cop...maxCop {
var minAlp = min(currentAlp+1,maxAlp)
var minCop = min(currentCop+1,maxCop)
dp[minAlp][currentCop] = min(dp[minAlp][currentCop],dp[currentAlp][currentCop] + 1)
dp[currentAlp][minCop] = min(dp[currentAlp][minCop],dp[currentAlp][currentCop] + 1)
...
4. ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํ์ธํ์ฌ ํด๋น ๋ฌธ์ ์ ์๊ณ ๋ ฅ ์ฝ๋ฉ๋ ฅ์ ๋ํ dp ์์น๋ฅผ ๋น๊ตํ๋ค.
๋ง์ฝ ํ์ฌ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ด ๋ฌธ์ ์ ์ฝ๋ฉ๋ ฅ,์๊ณ ๋ ฅ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ํ ์ ์๋ ๋ฌธ์ ์ด๋ฏ๋ก,
ํด๋น ๋ฌธ์ ๋ฅผ ํ๋ฉด ์ป์ ์ ์๋ ์ ์๋ฅผ ํ์ฌ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ ๋ํด์ค๋ค.
์ต๋ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ ๋์ด๊ฐ ์๋ ์์ผ๋ฏ๋ก ๊ทธ ๋ ์ต๋๊ฐ์ผ๋ก ์ค์ ํด ์ค๋ค.
๊ทธ ๋ค์ ํด๋น ์์น์ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํด ์ค๋ค.
problems.forEach { problem in
if currentAlp >= problem[0] && currentCop >= problem[1] {
minAlp = min(maxAlp,currentAlp+problem[2])
minCop = min(maxCop,currentCop+problem[3])
dp[minAlp][minCop] = min(dp[minAlp][minCop],dp[currentAlp][currentCop] + problem[4])
}
}
}
}
5. ์ต๋ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ ์์น๋ฅผ ๋ฐํํ๋ค.
return dp[maxAlp][maxCop]
Result
์๊ฐ ๋ณต์ก๋๋ ์๊ณ ๋ ฅ, ์ฝ๋ฉ๋ ฅ์ ์ต๋๊ฐ์ด 150, ๋ฌธ์ ์ ์ต๋๊ฐ์ด 100์ด๋ฏ๋ก O(150*150*100)์ด ๋๋ค.
๊ณต๊ฐ ๋ณต์ก๋๋ ์ฝ๋ฉ๋ ฅ ์๊ณ ๋ ฅ์ ์ต๋๊ฐ์ ์ ์ฅํ๋ฏ๋ก O(150*150)์ด ๋๋ค.
Source Code
func solution(_ alp:Int, _ cop:Int, _ problems:[[Int]]) -> Int {
var maxAlp: Int = alp
var maxCop: Int = cop
problems.forEach {
maxAlp = max(maxAlp,$0[0])
maxCop = max(maxCop,$0[1])
}
var dp: [[Int]] = Array(repeating:Array(repeating:10000,count:maxCop+1),count:maxAlp+1)
dp[alp][cop] = 0
for currentAlp in alp...maxAlp {
for currentCop in cop...maxCop {
var minAlp = min(currentAlp+1,maxAlp)
var minCop = min(currentCop+1,maxCop)
dp[minAlp][currentCop] = min(dp[minAlp][currentCop],dp[currentAlp][currentCop] + 1)
dp[currentAlp][minCop] = min(dp[currentAlp][minCop],dp[currentAlp][currentCop] + 1)
problems.forEach { problem in
if currentAlp >= problem[0] && currentCop >= problem[1] {
minAlp = min(maxAlp,currentAlp+problem[2])
minCop = min(maxCop,currentCop+problem[3])
dp[minAlp][minCop] = min(dp[minAlp][minCop],dp[currentAlp][currentCop] + problem[4])
}
}
}
}
return dp[maxAlp][maxCop]
}
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] 2022 KAKAO TECH INTERNSHIP ๋ฑ์ฐ์ฝ์ค ์ ํ๊ธฐ (0) | 2022.08.29 |
---|---|
[Swift] 2022 KAKAO TECH INTERNSHIP ๋ ํ ํฉ ๊ฐ๊ฒ ๋ง๋ค๊ธฐ (0) | 2022.08.24 |
[Swift] 2022 KAKAO TECH INTERNSHIP ์ฑ๊ฒฉ ์ ํ ๊ฒ์ฌํ๊ธฐ (1) | 2022.08.23 |
[JS] ํ๋ก๊ทธ๋๋จธ์ค ์ซ์์ ํํ (0) | 2022.04.11 |
[JS] ํ๋ก๊ทธ๋๋จธ์ค ๊ฐ์ ์ซ์๋ ์ซ์ด (0) | 2022.04.11 |
๋๊ธ