🔗 타겟 넘버
주어진 숫자 배열에서 각 숫자를 더하거나 빼서 특정 타겟 숫자를 만들 수 있는 모든 경우의 수를 찾는 문제로, 가능한 모든 조합을 탐색하기 때문에 완전탐색이다.
🥊 접근 방법 🥊
numbers 값을 계속 더하다가 target 값이 안 나오면 빠꾸해서 값을 빼주면 되겠다고 생각했다. 비슷한 문제를 풀어본 적이 있어서 바로 DFS를 떠올렸다.
DFS
DFS를 사용해 각 숫자에 더하기(+), 빼기(-) 두 가지 경우 모두를 탐색한다.
// basis part
if(i == numbers.length){
if(total == target) answer++;
return;
}
// inductive part
DFS(numbers, target, i+1, total + numbers[i]); // 그림의 초록색 부분
DFS(numbers, target, i+1, total - numbers[i]); // 그림의 주황색 부분
✨ 전체코드 ✨
- total : numbers의 원소들을 더한 값
- answer : 경우의 수
class Solution {
static int answer;
public int solution(int[] numbers, int target) {
answer = 0;
DFS(numbers, target, 0, 0);
return answer;
}
public static void DFS(int[] numbers, int target, int i, int total){
// basis part
if(i == numbers.length){
if(total == target) answer++;
return;
}
// inductive part
DFS(numbers, target, i+1, total + numbers[i]);
DFS(numbers, target, i+1, total - numbers[i]);
}
}
🌀 성능
- 메모리 : 72.6 MB
- 시간 : 0.35 ms
🥕 비슷한 문제
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 바탕화면 정리 (0) | 2024.06.21 |
---|---|
[프로그래머스] 공원 산책 (0) | 2024.06.16 |
[프로그래머스] 추억 점수 (0) | 2024.05.24 |
[프로그래머스] 달리기 경주 (0) | 2024.05.23 |
[프로그래머스] DAY 3. 문자열 섞기 | 문자 리스트를 문자열로 변환하기 | 문자열 곱하기 | 더 크게 합치기 | 두 수의 연산값 비교하기 (0) | 2024.04.28 |