본문 바로가기
알고리즘/programmers

43165: 타겟 넘버[DFS/BFS]

by cjw.git 2021. 1. 5.

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


1. 문제

  • 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. 문제의 조건

  • 2 <= 숫자의 개수 <= 20
  • 1 <= 숫자 범위 <= 50
  • 1 <= target <= 1000

 


더보기

3. 문제 접근

  • 시간 복잡도

    추후 보강

 

  • 아이디어

    처음엔 완전 탐색으로 재귀를 이용하여 어떻게 방식을 시도해보려고 하였으나, 실패하였습니다.
    하지만 배웠던 DFS를 떠올리게 되었습니다.
    왜 DFS가 떠올랐냐면
    [1, 1, 1, 1, 1]deapth가 가 깊어질수록 [-1 -1 -1 -1 -1], [-1 -1 -1 -1 1], [-1 -1 -1 1 -1], [-1 -1 -1 1 1] ... [1 1 1 1 1]식으로 나아가는 과정입니다. 해당 방식을 브루트포스 즉, 완전탐색과 동일하다고 생각합니다.
    DFS는 깊이 우선 탐색이므로 deapth가 깊어지면서 해당 연산을 수행하여 비교하기가 쉽기 때문입니다.

 


4. 풀이 방법

  • 만약 깊이가 구해야하는 모든 수길이가 같다면 numbers를 전부 더해주고 타켓넘버가 맞으면 counting을 하고,
    아니면 numbers[deapth]를 -1로 곱해주면서 다시 재귀 후 -1로 곱해주고 다시 재귀를 반복합니다.
    첫 번째 재귀는 -1(음수)가 되고 첫 번째 재귀가 끝난 후 두 번째 재귀는 1(양수)가 됩니다.

 


5. 소스코드

 


 

cjw.git@gmail.com

'알고리즘 > programmers' 카테고리의 다른 글

42860: 조이스틱(그리디)  (0) 2021.01.06
42238: 입국심사[이분탐색]  (0) 2021.01.06
42885: 구명보트[그리디]  (0) 2021.01.05
42583: 다리를 지나는 트럭[스택/큐]  (0) 2021.01.05
42586: 기능개발[스택/큐]  (0) 2021.01.05

댓글