Algorithm/BOJ
백준 2961 도영이가 만든 맛있는 음식
삼쓰 웅쓰
2021. 2. 19. 14:04
728x90
출처: https://www.acmicpc.net/problem/2961
분류: 재귀
접근방식
N이 1 ~ 10 으로 아주 작아서 백트래킹으로 모든 조합을 다 계산해서 풀 수 있었습니다.
처음에는 뭐에 홀렸는지 단순히 이중 포문으로 모든 경우를 다 체크할 수 있지 않나? 라고 생각했었네요...
단순히 이렇게 하면 중간을 건너뛴 1, 3 같은 조합은 체크할 수가 없겠죠 ㅠㅠ
s는 곱이고 b는 합이기 때문에 초기값으로 1, 0을 넣고 시작해줬습니다.
처음을 안 넣었을 경우는 계산하면 안 되기 때문에 각 케이스에서 재료를 넣어서 새롭게 만든 조합의 차만 생각을 해줬습니다.
해결방법
let n = Int(readLine()!)!
var flavors = [[Int]]()
for _ in 0..<n {
flavors.append(readLine()!.split(separator: " ").map({ Int(String($0))! }))
}
var minDiff = Int.max
func combine(_ index: Int, s: Int, b: Int) {
guard index < n else { return }
let newS = s * flavors[index][0]
let newB = b + flavors[index][1]
if minDiff > abs(newS-newB) {
minDiff = abs(newS-newB)
}
combine(index+1, s: newS, b: newB)
combine(index+1, s: s, b: b)
}
combine(0, s: 1, b: 0)
print(minDiff)
배운점
정신 똑땍이 차리자.