ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 깊이/너비 우선 탐색(DFS/BFS) - 타겟 넘버
    Algorithm 2021. 5. 6. 12:20

    아래 문제는 프로그래머스에서 제공하는 코딩테스트 > 깊이/너비 우선 탐색(DFS/BFS) > 타겟 넘버 (고득점 Kit)의 문제입니다🧑🏻‍💻

     

    문제 제시

    n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

    -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3

    사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

    제한사항

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

    입출력 예

    [1, 1, 1, 1, 1] 3 5

     

    문제 해결

    import Foundation
    
    var number: [Int] = []
    var targets: Int = 0
    var count: Int = 0
    
    func solution(_ numbers:[Int], _ target:Int) -> Int {
        number = numbers
        targets = target
        
        calculrate(index: 0, sum: 0)
    
        return count
    }
    
    func calculrate(index: Int, sum: Int) {
        if index == number.count {
            if sum == targets {
                count += 1
            }
            return
        }
        calculrate(index: index + 1, sum: sum + number[index])
        calculrate(index: index + 1, sum: sum - number[index])
    }

    사용된 개념

     - DFS

     - 조건문

     - 재귀함수

     

    문제 뒷담화

    이번 문제는 전체를 파악하는 트리같은 구조로 깊이탐색을 하는 문제였다.

    즉 재귀함수 방법을 사용해야했다.

    우선 재귀를 돌려줄 함수를 하나 더 정의하였다. 인덱스 값과 총합을 파라미터로 받는다.

    만약 함수가 끝까지 돌아 인덱스가 배열의 수와 같아진다면 조건을 판별한다.

    합이 주어진 타겟 정수와 같으면 카운트를 1 증가시키고 리턴하여 함수를 종료한다.

    그렇게 정의해주고 해당 함수를 내부에서 재귀적으로 호출한다.

    호출 시 +, - 를 해줘야함으로 두개의 함수 호출로 만든다. 그렇게 되면 가지처럼 알아서 재귀를 돈다.

    그리고 메인 함수에서 해당 함수를 호출하는데 초기값으로 0을 인자로 전달해준다.

    마지막으로 총 카운트를 반환하여 답을 도출해낼 수 있다.

    재귀함수에 대해 자세히 몰랐던 부분을 반성하며 문제 파악의도를 먼저 생각해보았다.

    어쨋든 전체 경우의 수를 계속 돌아야하는데 효율적으로 돌 방법을 생각해보다 재귀함수를 찾게되었다.

    좀 더 알고리즘적으로 사고해보자!

     

     

    [참고자료]

    programmers.co.kr/learn/courses/30/lessons/43165

     

    'Algorithm' 카테고리의 다른 글

    N개의 최소공배수  (0) 2021.05.10
    완전탐색 > 카펫  (0) 2021.05.06
    탐욕법 - 큰 수 만들기  (0) 2021.05.05
    정렬 - H-Index  (0) 2021.05.05
    정렬 - 가장 큰 수  (0) 2021.05.04
Designed by Tistory.