Open MUKER-WON opened 4 weeks ago
이러니 시간초과가 날 수 밖에..없었음 머리 식히고 다시 풀어 보겠음
import Foundation
func solution(_ dice:[[Int]]) -> [Int] {
let eachCount = dice.count / 2
var ans = [Int]()
var maxWin = 0
// A와 B가 가질 수 있는 주사위의 경우의 수 구하기
var diceCases = [(A: [Int], B: [Int])]()
func diceCase(current: Int, a: [Int]) {
if a.count == eachCount {
// Set으로 초기화를 시켜주면 contains 시간복잡도가 무려 O(1)
let b = (0..<dice.count).filter { !Set(a).contains($0) }
diceCases += [(a, b)]
return
}
for i in current..<dice.count {
diceCase(current: i+1, a: a+[i])
}
}
diceCase(current: 0, a: [])
func Allsum(index: [Int]) -> [Int] {
// 주사위 갯수에 따른 주사위의 경우의 수를 합해서 배열로 반환
func calculate(current: Int, sum: Int) -> [Int] {
if current == index.count {
return [sum]
}
var result = [Int]()
for i in dice[index[current]] {
result += calculate(current: current + 1, sum: sum + i)
}
return result
}
return calculate(current: 0, sum: 0)
}
for (A, B) in diceCases {
let sumA = Allsum(index: A)
let sumB = Allsum(index: B)
// 모든 경우의 수를 또 모든 경우의 수로 비교.. 경우의 수 지옥
// A가 이긴 경기에 따라 maxWin과 ans 최신화
var win = 0
for a in sumA {
for b in sumB {
if a > b {
win += 1
}
}
}
if win > maxWin {
maxWin = win
ans = A.map { $0 + 1 }
}
}
return ans
}
크크 일단 손에 잡은 순간부터 문제를 하나 발견했어. 그건 바로 내가 시간복잡도를 계산할 줄 모른다는 것 . n 범위가 10일 때 부터 대충 엄청 오래걸리는 문제겠구나 느끼긴 했지만 시간복잡도 이정도 쯤 되겠네, 이렇게 바로 연산 불가.
시간복잡도에 대해서 공부하는 시간을 가졌고... 챗지피티한테 물어보니까 더 어려웠음 그래서 차근차근 경우의 수부터 구해봄!
inputSize에 대한 절차의 수! 라는 표현 좋다
입력이 제한되어 있기 때문에 브루트 포스 (완전탐색) 형태로 구현하면 어떨까 생각
11/6(수)
주사위 고르기