[프로그래머스] 타겟넘버 with Java

유재식·2020년 10월 12일
2
post-thumbnail

DFS 문제 - 타겟 넘버 👀

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

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

제한사항

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

입출력 예

풀이

이 문제는 유망한지를 판단해서 시간을 줄일 수 있을거라고 처음에 생각했지만 더하기 빼기로 인하여 마지막까지 어떠한 숫자가 나올수 있을지 알 수 없기 때문에 모든 경우의 수를 탐색하여야 했다.

class Solution {
    public int solution(int[] numbers, int target) {
        int answer = 0;
        
        answer = bfs(numbers, target, numbers[0], 1) + bfs(numbers, target, -numbers[0], 1);
        
        return answer;
    }
    
    public int bfs(int[] numbers, int target, int sum, int i) {
        
        if(i == numbers.length) {
            if(sum == target) {
                return 1;
            } else {
                return 0;
            }
        }
        
        int result = 0;
        result += bfs(numbers, target, sum+numbers[i], i+1);
        result += bfs(numbers, target, sum-numbers[i], i+1);
        return result;
    }
}

재귀 함수 호출을 이용하여 bfs를 사용하였는데 매개변수로 numbers 배열과 target 숫자, 그리고 현재까지의 값 sum, 다음 인덱스 i를 받았다.

처음 bfs 함수를 호출할 때 numbers의 0번째 숫자와 다음인덱스 1을 넣어준 것이다. 그렇게 계속해서 number.length-1의 인덱스까지 모두 탐색하고 마지막으로 호출 시 인덱스 i가 numbers.length와 같게 된다면 리프노드까지 탐색을 모두 한것이기 때문에 target 숫자와 같은지 확인하고 같으면 1을 반환 아니면 0을 반환하여 카운트를 하게된다.

profile
토프레 무접점 사고싶다

2개의 댓글

comment-user-thumbnail
2020년 11월 27일

그래 그리 쉽지는 않겠지
나를 허락해준 세상이란
손쉽게 다가오는 편하고도 감미로운 공간이 아냐
그래도 날아오를 거야
작은 날개짓에 꿈을 담아
조금만 기다려 봐
Oh my~

그래 그리 쉽지는 않겠지
나를 허락해준 세상이란
손쉽게 다가오는 편하고도 감미로운 공간이 아냐
그래도 날아오를 거야
작은 날개짓에 꿈을 담아
조금만 기다려 봐
Oh my love

1개의 답글