💬 Idea
라이언이 가장 높은 점수차로 어피치를 이길 수 있는 경우를 찾는 DFS 문제이다.
- 라이언의 점수판을 만든다. (0점부터 10점까지를 기록할 수 있도록)
- dfs를 수행할 재귀함수를 설계한다.
- [ dfs 재귀함수 설계 조건 ]
⭐️ return 지점 찾기 → 남은 화살이 0개 이하이거나, 최종 index가 10에 도달한 경우
최종 index가 10에 도달한 경우
➡️ 라이언의 점수판의 마지막 인덱스에 남은 화살의 수를 기록한다.
라이언이 만들 수 있는 점수의 경우의 수는 2가지이다.
- ‘어피치가 기록한 점수 + 1’ 점
- 라이언의 현재 남은 화살의 개수가 ‘어피치가 기록한 점수 + 1’ 점보다 크다면 해당 인덱스의 라이언 점수를 ‘어피치가 기록한 점수 + 1’점으로 기록하고 다음 인덱스로 dfs를 수행한다.
- 0점
- 언제든지 0점을 기록할 수 있으므로 해당 인덱스의 라이언 점수를 0점으로 기록하고 다음 인덱스로 dfs를 수행한다. (라이언의 남은 화살 개수 변동 X)
💬 풀이
import Foundation
varryanWinInfo:[[Int]]=[]varryanWinScore:Int=-1func solution(_ n:Int, _ info:[Int])->[Int]{letryanInfo=[Int](repeating:0, count:11)dfs(n,0, ryanInfo, info)
// 라이언이 우승할 수 없는 경우
if ryanWinScore <=0{return[-1]}
ryanWinInfo.sort{
$0.filter{ $0 !=0}.count > $1.filter { $0 !=0}.count
}return ryanWinInfo.first!
}
// MARK: - 라이언의 점수판에 점수를 기록하는 dfs 함수
func dfs(_ leftArrow:Int, _ index:Int, _ ryanInfo:[Int], _ appeachInfo:[Int]){varryanInfo= ryanInfo
letleftArrow= leftArrow
if index ==10 || leftArrow <=0{if index ==10{ryanInfo[10]= leftArrow
}
// 점수차
letgap=ryanAppeachGap(appeachInfo, ryanInfo)if gap == ryanWinScore {
ryanWinInfo.append(ryanInfo)}elseif gap > ryanWinScore {
ryanWinScore = gap
ryanWinInfo =[ryanInfo]}return}if leftArrow >appeachInfo[index]{ryanInfo[index]=appeachInfo[index]+1letnextLeftArrow= leftArrow -(appeachInfo[index]+1)dfs(nextLeftArrow, index +1, ryanInfo, appeachInfo)ryanInfo[index]=0}dfs(leftArrow, index +1, ryanInfo, appeachInfo)}
// MARK: - 라이언과 어피치의 점수 차를 반환하는 함수
func ryanAppeachGap(_ appeach:[Int], _ ryan:[Int])->Int{varappeachScore=0,ryanScore=0for(index, ryan)in ryan.enumerated(){if ryan ==0{
appeachScore +=(appeach[index]>0?(10- index):0)}else{
ryanScore +=(10- index)}}return ryanScore - appeachScore
}소요시간 : 헤매서 오래 걸렸다.. 중간에 타이머가 날아가서 기록하지 못함
💬 Idea라이언이 가장 높은 점수차로 어피치를 이길 수 있는 경우를 찾는 DFS 문제이다.
⭐️ return 지점 찾기 → 남은 화살이 0개 이하이거나, 최종 index가 10에 도달한 경우
최종 index가 10에 도달한 경우➡️ 라이언의 점수판의 마지막 인덱스에 남은 화살의 수를 기록한다.
라이언이 만들 수 있는 점수의 경우의 수는 2가지이다.
💬 풀이소요시간: 헤매서 오래 걸렸다.. 중간에 타이머가 날아가서 기록하지 못함