알고리즘/알고리즘 문제풀이

DFS/BFS_Programmgers_타겟 넘버 [swift]

Downey 2025. 2. 6. 14:52

코딩테스트를 보다가.. 너무 못해진 것 같기도하고 그래서 다시 공부를 시작

풀어 본 건 아니지만, 해당 유형이 기억이 안날 줄 알았는데 생각보다 빠르게 품 13분?

https://school.programmers.co.kr/learn/courses/30/lessons/43165

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

정답 코드

더보기
import Foundation

func solution(_ numbers:[Int], _ target:Int) -> Int {
    var sol = 0
    
    var queue = numbers
    let firstItem = queue.removeFirst()
    
    sol += recursive(startItem: -firstItem, restItem: queue, target: target)
    sol += recursive(startItem: firstItem, restItem: queue, target: target)
    
    return sol
}

func recursive(startItem: Int, restItem: [Int], target: Int) -> Int {
    guard !restItem.isEmpty else { return target == startItem ? 1 : 0}
    
    var currentValue = startItem
    
    var nextQueue = restItem
    let nextItem = nextQueue.removeFirst()
    
    let lhs = recursive(startItem: startItem + nextItem, restItem: nextQueue, target: target)
    let rhs = recursive(startItem: startItem - nextItem, restItem: nextQueue, target: target)
    
    return lhs + rhs
}

 

글을 쓰면서 생각하는데, 문제 조건이 numbers의 순서를 바꾸지 않고, 음수 혹은 양수를 더해서 target이 되는 경우의 수를 구하는 것 이었으므로,

removeLast()를 쓰면 수가 많은 경우에 cow비용이 덜 발생할 것 같다는 생각이 스쳤다.

근데 문제 조건이

 

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

였으므로, 큰 영향은 없었을 것 같음

 

성능

더보기
테스트 1 통과 (797.81ms, 16.3MB)
테스트 2 통과 (904.05ms, 16.2MB)
테스트 3 통과 (0.74ms, 16.3MB)
테스트 4 통과 (3.66ms, 16.4MB)
테스트 5 통과 (23.22ms, 16.5MB)
테스트 6 통과 (1.33ms, 16.4MB)
테스트 7 통과 (0.71ms, 16.5MB)
테스트 8 통과 (5.94ms, 16.3MB)