๋ฌธ์ ์ค๋ช
๋ฌธ์ ํ์ด
์ฒจ์ ๋ฌด์ํ๊ฒ DFS๋ก ํ์ด์ ํฉ์ด n์ด ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ค.
ex) n์ด 3์ด๋ฉด
[3,0,0,0,0,0,0,0,0,0,0]
[2,1,0,0,0,0,0,0,0,0,0]
[0,3,0,0,0,0,0,0,0,0,0]
[0,2,1,0,0,0,0,0,0,0,0]
...
n์ด 9๋ฅผ ๋์ด๊ฐ๋๊น ์๊ฐ์ด๊ณผ..
๊ฒฐ๊ตญ ์ ๋ต์ ์ด์ง ๋ณด๊ณ ๋ค์ ๊ตฌํํด ๋ณด์๋ค.
ํต์ฌ์
์ดํผ์น๋ฅผ ์ด๊ธฐ๋ ๊ฒฝ์ฐ / ์ง๋ ๊ฒฝ์ฐ๋ก ๋๋๋ ๊ฒ
์ดํผ์น์ ํ์ด์ด
[2,3,1,0,0,0,0,1,3,0,0]
์ผ ๋
์ดํผ์น๋ฅผ ์ด๊ธฐ๋ ๊ฒฝ์ฐ
0๋ฒ์งธ ์ธ๋ฑ์ค(10์ )์ ์ด๊ธฐ๋ ๊ฒฝ์ฐ๋ ๋ผ์ด์ธ์ด 3๋ฐ์ ์์์ ๋๋ค. (์ฌ๊ธฐ์ 4๋ฐ ์ด์ ์๋ฉด ํ์ด ๋ญ๋น๋ก ์๋ฏธ๊ฐ ์๋ค.)
์ดํผ์น๋ฅผ ์ง๋ ๊ฒฝ์ฐ
์ด์ฐจํผ ์ง ๊ฑฐ ํ์ด ๋ญ๋น ์์ด 0๊ฐ๋ก ์ง๋ค.
์ด ๊ฒฝ์ฐ๋ก DFS๋ฅผ ๋๋ ค์ค๋ค.
DFS(ํ์ฌ์ธ๋ฑ์ค(=๊น์ด), ํ์ด์ ์ดํฉ, ํ์ด ๋ฆฌ์คํธ)
๋ก ๋๋ฆฌ๋ฉฐ
๊น์ด๊ฐ 10์ด ๋์๊ฑฐ๋ ํ์ด์ ๋ค ์ผ์ ๋ DFS๋ฅผ ์ข ๋ฃ์ํจ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ์ ํ์ด์ด ๋จ์๋๋ฐ ์ข ๋ฃ ๋์์ผ๋ฉด ๋จ์ ํ์ด์ 0์ ์ ๋ชฐ์๋ฃ๋๋ค. (์ ์์ฐจ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ๋ฎ์์ ์์ ํ์ด์ด ๋ง์๊ฒ ์ ๋ฆฌํ๋ฏ๋ก)
์ฝ๋
func solution(_ n:Int, _ info:[Int]) -> [Int] {
// ์ดํผ์น์ ๋์ ์ ์ ์ฐจ์ด๋ฅผ ๋ฆฌํด
func getScoreDiff(_ arr: [Int]) -> Int {
var apeachScore = 0
var lionScore = 0
for i in 0..<11 {
if arr[i] == 0 && info[i] == 0 {
continue
}
if arr[i] > info[i] {
lionScore += (10-i)
}
else {
apeachScore += (10-i)
}
}
return lionScore - apeachScore
}
// ๋ ๋ฎ์ ์ ์์ ํ์ด์ด ์์ผ๋ฉด true ๋ฆฌํด
func isMoreThanLowScore(answer: [Int], arr: [Int]) -> Bool {
for i in stride(from: 10, through: 0, by: -1) {
if answer[i] < arr[i] {
return true
}
else if answer[i] > arr[i] {
return false
}
}
return false
}
var answer = Array(repeating: 0, count: 11)
var maxScore = 0
func DFS(depth: Int, arrowCount: Int, arr: [Int]) {
// ๋๊น์ง ๋์๊ฑฐ๋ ํ์ด์ ๋ค ์ผ์ ๊ฒฝ์ฐ
if arrowCount == n || depth == 10 {
var arr = arr
// ๋จ์ ํ์ด์ด ์๋ค๋ฉด ๊ทธ ํ์ด์ 0์ ์ ๋ค ๋ฃ์ด์ค
if arrowCount < n {
arr[10] = n-arrowCount
}
let score = getScoreDiff(arr) // ์ ์ ์ฐจ์ด๋ฅผ ๊ตฌํจ
// ์ ์ ์ฐจ์ด๊ฐ ๋ ํฌ๋ฉด ์ ๋ต์ ๋ฐ๊ฟ
if maxScore < score {
maxScore = score
answer = arr
}
// ํ์ฌ ์ ๋ต๊ณผ ์ ์์ฐจ์ด๋ ๋๊ฐ์ง๋ง ๋ฎ์ ์ ์ํ์ ํ์ด์ด ๋ ๋ง์ผ๋ฉด ์ ๋ต ๋ฐ๊ฟ
else if maxScore == score && isMoreThanLowScore(answer: answer, arr: arr) {
answer = arr
}
}
else {
let apeachWinCount = info[depth] + 1 // ์ดํผ์น๋ฅผ ์ด๊ธธ ์ ์๋ ๊ฐ์
// ์ง๊ธ ์ดํผ์น๋ฅผ ์ด๊ธธ ์ ์๋ ํ์ด์ด ๋จ์์๋ค๋ฉด
if apeachWinCount+arrowCount <= n {
var arrWin = arr
arrWin[depth] = apeachWinCount
// ์ดํผ์น๋ฅผ ์ด๊ธฐ๋ ๊ฒฝ์ฐ DFS
DFS(depth: depth+1, arrowCount: arrowCount+apeachWinCount, arr: arrWin)
}
// ์ดํผ์น๋ฅผ ์ง๋ ๊ฒฝ์ฐ DFS (0์ผ๋ก ์ง๋ค.)
DFS(depth: depth+1, arrowCount: arrowCount, arr: arr)
}
}
DFS(depth: 0, arrowCount: 0, arr: [0,0,0,0,0,0,0,0,0,0,0])
return maxScore == 0 ? [-1] : answer
}
ํ๊ธฐ
ํธ๋๋ฐ ์ ๋ง ์ค๋ ๊ฑธ๋ ธ๋ค... ์ฒ์์ 1์๊ฐ์ ๋ ์จ์ ํ์๊ณ
์๊ฐ์ด๊ณผ ๋๋ค๋ก ์ด๋ป๊ฒ๋ ์ค๊ธฐ๋ก ํ์ด๋ณด๋ ค๋ค๊ฐ.. ์ฐ์ผ๋ก ๊ฐ
๊ฒฐ๊ตญ ์ ๋ต๋ณด๊ณ ์๋ชป๋ ์ ๊ทผ์ด์์์ ๊นจ๋ฌ์๋ค.
ํ๋ฃจ ์ด์ ํฌ์ํ๋ฉด ๋ต์ ๋ณด์