개발하는 동글 :]

[프로그래머스],[양궁대회],[Swift] 본문

카테고리 없음

[프로그래머스],[양궁대회],[Swift]

동글하다 2023. 6. 16. 00:28

풀이

1. 배열의 총합이 n보다 작으면서 info배열과 길이가 같은 모든 상황을 검색한다.

-> 재귀함수로 구현

2. 각 상황에서의 어피치와 라이언의 점수를 계산하고 비교한다.

3. 라이언이 이기는 상황에서 점수 차가 기존의 점수보다 높으면 값을 변경하고 같으면 제한조건에 맞으면 변경한다.

4. 라이언이 이기는 상황이 없으면 [-1]을 리턴한다.

코드

오답코드 3번 과정이 없어서 오답

import Foundation

func solution(_ n:Int, _ info:[Int]) -> [Int] {
    
    var result = [0]
    
    func makeScore(_ ary:[Int], _ num:Int){
        
        if ary.count == info.count{ //각 배열의 상황에서 점수를 계산하고 비교한다
            if num == n{
                var aScore = 0
                var lScore = 0
            
                for i in 0..<ary.count{ // 점수계산
                    
                    if info[i] >= ary[i]{
                        if info[i] != 0 { aScore += 10 - i }
                    } else {
                        if ary[i] != 0 { lScore += 10 - i }
                    }
                }
                if lScore > aScore{ // 라이언이 이길 때 기존의 점수차 보다 크면 값 변경
                    if result[0] < lScore - aScore{
                        result = [lScore - aScore] + ary
                    }
                }
            }
            
        } else {
            for i in 0...n{
                if num + i <= n{
                    makeScore(ary + [i],num + i) //모든 상황을 가정한 배열을 만든다    
                } else{ break } 
            }
        }    
    }
    makeScore([],0)
    result.remove(at: 0)
    return result.isEmpty ? [-1] : result
}
//8번 18번 실패

최종 정답 코드

import Foundation

func solution(_ n:Int, _ info:[Int]) -> [Int] {
    
    var result = [0]
    
    func makeScore(_ ary:[Int], _ num:Int){
        
        if ary.count == info.count{ //각 배열의 상황에서 점수를 계산하고 비교한다
            if num == n{
                var aScore = 0
                var lScore = 0
            
                for i in 0..<ary.count{ // 점수계산
                    
                    if info[i] >= ary[i]{
                        if info[i] != 0 { aScore += 10 - i }
                    } else {
                        if ary[i] != 0 { lScore += 10 - i }
                    }
                }
                if lScore > aScore{ // 승리상황
                    
                    var temp = [lScore - aScore] + ary
                    var l = result.count - 1
                    
                    if result[0] < lScore - aScore { // 기존 점수차보다 크면 변경
                        result = temp
                    } else if result[0] == lScore - aScore{ // 같을 경우 조건 우선순위로 변경
                        for i in 0...l - 1{
                            if temp[l - i] > result[l - i]{
                                result = temp
                                break
                            } else if temp[l - i] == result[l - i]{
                                continue
                            } else {
                                break
                            }
                        }
                    }
                }
            }
            
        } else {
            for i in 0...n{
                if num + i <= n{
                    makeScore(ary + [i],num + i) //모든 상황을 가정한 배열을 만든다    
                } else{ break } 
            }
        }    
    }
    makeScore([],0)
    result.remove(at: 0)
    return result.isEmpty ? [-1] : result
}