Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- retain cycle
- 자료구조
- coremotion
- UIKit
- 양궁대회
- TableView Section
- 강한 참조 순환
- class struct
- TableView
- UserDefaults
- 롤케이크 자르기
- Input Output
- CoreData
- firebase
- CarouselCollectionview
- ReferceCycle
- NavigationSearchBar
- til
- Carousel CollectionView
- 테이블뷰 나누기
- Value Type Reference Type
- Array vs Linked List
- 면접을 위한 CS 전공 지식 노트 Tree
- tableview section별 다른 cell적용
- SWIFT
- 면접을 위한 CS전공 지식 노트
- 프로그래머스
- Reference Cycle
- @escaping
- wil
Archives
- Today
- Total
개발하는 동글 :]
[프로그래머스],[양궁대회],[Swift] 본문
풀이
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
}