diff --git a/target_number.java b/target_number.java new file mode 100644 index 0000000..7ba020b --- /dev/null +++ b/target_number.java @@ -0,0 +1,53 @@ +import java.util.*; + +class Solution { + int answer = 0; + List> adj = new ArrayList<>(); + List sumOfNode = new ArrayList<>(); + + public int solution(int[] numbers, int target) { + adj.add(new ArrayList<>()); // 0번 노드 = 루트 + sumOfNode.add(0); + + List currentLevel = new ArrayList<>(); + currentLevel.add(0); + + for (int num : numbers) { + List nextLevel = new ArrayList<>(); + for (int parent : currentLevel) { + int parentSum = sumOfNode.get(parent); + + for (int sign : new int[]{1, -1}) { + int child = adj.size(); + adj.add(new ArrayList<>()); + sumOfNode.add(parentSum + sign * num); + adj.get(parent).add(child); + nextLevel.add(child); + } + } + currentLevel = nextLevel; + } + + boolean[] visited = new boolean[adj.size()]; + dfs(0, target, visited); + + return answer; + } + + public void dfs(int v, int target, boolean[] visited) { + visited[v] = true; + + if (adj.get(v).isEmpty()) { + if (sumOfNode.get(v) == target) { + answer++; + } + return; + } + + for (int next : adj.get(v)) { + if (!visited[next]) { + dfs(next, target, visited); + } + } + } +}