타겟 넘버
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🚨모든 가능한 조합을 탐색해서 target에 도달하는 경우의 수 세는 문제
→ 어떤 방식으로 모든 조합을 탐색할 수 있을까?
✅ 문제 풀이
[문제 탐색]
- 숫자 배열 각 원소에 대해 가능한 선택 : 2가지
- 총 n개의 숫자가 있을 때, 모든 가능한 경우의 수 : 2^n가지
- 모든 경로를 따라가며 누적합을 구하는 방식 : DFS 사용

- 루트 노드(초기 합 0) 에서 시작
- 각 레벨마다 숫자 하나씩 선택하며 + or - 붙여서 내려감
- 마지막 레벨까지 내려갔을 때 누적된 합을 계산해 target과 비교
- target이 아니면 다시 되돌아가서 탐색 → 재귀함수로 구현
[코드 설계]
- 루트 노드부터 탐색 시작
- 재귀 인자로 다음 인덱스 값(idx+1)과 누적 합(currentSum)을 넘겨줌
- 재귀 시, 누적 합에서 숫자마다 +/- 두 가지로 분기 처리
- dfs(idx+1, currentSum + staticNum[idx]);
dfs(idx+1, currentSum - staticNum[idx]);
- dfs(idx+1, currentSum + staticNum[idx]);
- 인덱스(idx)가 마지막 노드(numbers.length) 이면 탐색 종료
- 현재까지 누적된 합(currentSum) 이 target이면 정답 카운트 증가
[가능한 시간복잡도]
완전탐색(재귀/DFS) 패턴으로 모든 가능한 경우의 수 : 2^n가지
DFS는 이 모든 경로를 한 번씩 방문함
=> 전체 시간복잡도 O(2^n) (문제에서 주어진 n의 범위는 20이하이기 때문에 2^20 = 1,048,576 이므로 1초 안에 무난히 처리됨)
✅풀이 코드
class Solution {
static int[] staticNum;
static int staticTarget;
static int answer = 0;
public int solution(int[] numbers, int target) {
staticNum = numbers;
staticTarget = target;
dfs(0,0);
return answer;
}
static void dfs(int idx, int currentSum) {
if(staticNum.length == idx){
if(currentSum == staticTarget){
answer++;
}
return;
}
dfs(idx+1, currentSum + staticNum[idx]);
dfs(idx+1, currentSum - staticNum[idx]);
}
}
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 폰켓몬(JAVA) 풀이 (0) | 2025.05.16 |
---|---|
[프로그래머스] 완주하지 못한 선수(JAVA) 풀이 (0) | 2025.05.07 |
[프로그래머스] K번째 수 자바(java) 풀이 (0) | 2024.11.08 |
[백준] 11866번 : 요세푸스 문제0 자바(JAVA) 풀이 (0) | 2024.10.25 |
[백준] 2193번 : 이친 자바(JAVA) 풀이 (0) | 2024.10.23 |