본문 바로가기
알고리즘 & 자료구조/프로그래머스

타겟 넘버

by 신재권 2023. 1. 23.
package programmers;

import java.util.LinkedList;
import java.util.Queue;

public class 타겟넘버 {

   public static int solution(int[] numbers, int target) {
      // return dfs(numbers, target, 0, 0);
      return bfs(numbers, target);
   }

   private static int bfs(int[] numbers, int target) {
      Queue<Pair> q = new LinkedList<>();
      q.add(new Pair(0, numbers[0]));
      q.add(new Pair(0, numbers[0] * -1));

      int answer = 0;

      while (!q.isEmpty()) {
         Pair p = q.poll();

         if (p.position == numbers.length - 1) {
            if (p.sum == target) {
               answer++;
            }
            continue;
         }

         int nPosition = p.position + 1;
         if (nPosition >= numbers.length) {
            continue;
         }

         q.add(new Pair(nPosition, p.sum + numbers[nPosition]));
         q.add(new Pair(nPosition, p.sum + numbers[nPosition] * -1));
      }

      return answer;
   }

   private static int dfs(int[] numbers, int target, int sum, int current) {
      int ans = 0;

      if (current == numbers.length) {
         if (target == sum) {
            return 1;
         }
         return 0;
      }

      ans += dfs(numbers, target, sum + numbers[current], current + 1);
      ans += dfs(numbers, target, sum + numbers[current] * -1, current + 1);

      return ans;
   }

   private static class Pair {
      int position;
      int sum;

      public Pair(int position, int sum) {
         this.position = position;
         this.sum = sum;
      }
   }

   public static void main(String[] args) {
      System.out.println(solution(new int[] {1, 1, 1, 1, 1}, 3));
      System.out.println(solution(new int[] {4, 1, 2, 1}, 4));
   }
}

'알고리즘 & 자료구조 > 프로그래머스' 카테고리의 다른 글

연속 부분 수열 합의 개수  (0) 2023.01.26
K진수에서 소수 개수 구하기  (0) 2023.01.25
귤 고르기  (0) 2023.01.22
전화번호 목록  (0) 2023.01.21
뉴스 클러스터링  (0) 2023.01.20