문제 설명
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 이하인 자연수입니다.
입출력 예시
numbers | target | return |
[1, 1, 1, 1, 1] | 3 | 5 |
[4, 1, 2, 1] | 4 | 2 |
풀이 코드
자주 나오는 DFS 깊이 우선 탐색 활용 문제 !
문제에서 배열을 옮기지 않는 상태로 적절히 덧셈, 뺄셈 연산을 한다고 했으므로, 2가지의 경우를 생각하면 된다.
depth 는 말 그대로 깊이를 뜻하는 변순데, numbers 배열의 길이가 노드 갯수라고 생각해서 if 분기 조건으로 아래와 같은 조건이 들어가게 됐다. 깊이있게 파고들면서 누적되는 sum 변수 값과 target 이 일치될 때, count 변수를 증가시키면 끝.
import java.util.Arrays;
class Solution {
static int count;
static int sTarget;
static int[] sNumbers;
public int solution(int[] numbers, int target) {
sNumbers = numbers.clone();
sTarget = target;
dfs(0, 0);
return count;
}
private static void dfs(int depth, int sum) {
if (depth == sNumbers.length) {
if (sum == sTarget) {
count++;
}
} else {
dfs(depth + 1, sum + sNumbers[depth]);
dfs(depth + 1, sum - sNumbers[depth]);
}
}
}
'DFS BFS' 카테고리의 다른 글
자바(Java) 알고리즘 문제풀이 여행경로 [프로그래머스 / DFS] (0) | 2022.11.24 |
---|---|
자바(Java) 알고리즘 문제풀이 네트워크 [프로그래머스 / DFS] (0) | 2022.11.23 |
자바(Java) 알고리즘 문제풀이 가장 먼 노드 찾기 [프로그래머스 / BFS] (0) | 2022.11.22 |
자바(Java) 알고리즘 문제풀이 미로탈출 [이코테 / BFS] (0) | 2022.10.09 |
자바(Java) 알고리즘 문제풀이 음료수 얼려먹기 [이코테 / DFS] (0) | 2022.10.09 |