코딩테스트/알고리즘 문제
[프로그래머스] 43165 타겟 넘버 - Java
glorypang
2025. 4. 28. 13:23
728x90
반응형
SMALL
📌 문제 정보
- 출처: 문제 링크
- 난이도: ⭐⭐
- 문제 유형: DFS / BFS
- 사용 언어: Java
🔍 문제 설명
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 이하인 자연수입니다.
💡 풀이 노트
- 문제는 배열의 각 숫자마다 + 또는 -를 붙여서 목표 값(target)을 만드는 방법의 수를 구하는 것
- DFS (깊이 우선 탐색) 를 사용해서 모든 가능한 조합을 탐색
- `dfs(numbers, target, index, sum)`
- `index`: 현재 보고 있는 숫자의 위치
- `sum`: 지금까지의 합계
- `dfs(numbers, target, index, sum)`
- 재귀 함수를 통해 두 가지 선택지를 만듦:
- 현재 숫자를 더하는 경우 (`sum + numbers[index]`)
- 현재 숫자를 빼는 경우 (`sum - numbers[index]`)
- 배열 끝까지(`index == numbers.length`) 도달했을 때, `sum == target`이면 경우의 수 1을 추가
👉 포인트
- 모든 경우를 시도한다 → 이진 트리처럼 매 숫자마다 + / - 두 가지 선택지가 생김
- 깊이가 깊어질수록(index가 커질수록) 하나하나 숫자를 처리
- 기저 조건(`index == numbers.length`)에 도달했을 때, 최종 합이 target과 같다면 1을 반환
- 모든 경로의 결과를 합산해서 정답을 만듬
- 예를 들어 `numbers = [1,1,1,1]`, `target = 2`일 때는
- 1번째 숫자에 +를 붙일지, -를 붙일지 선택 → 다음 숫자에서도 + 또는 -를 붙이고 계속 나아감
- 최종적으로 합이 2가 되는 경로만 카운트

🚀 코드 (Java)
class Solution {
public int solution(int[] numbers, int target) {
int answer = dfs(numbers, target, 0, 0);
return answer;
}
public int dfs (int[] numbers, int target, int index, int sum){
if(numbers.length == index)
return sum == target? 1: 0;
return dfs(numbers, target, index+1, sum+numbers[index]) + dfs(numbers, target, index+1, sum-numbers[index]);
}
}
🖥 실행 결과
입력 & 출력
numbers target return
[1, 1, 1, 1, 1] 3 5
[4, 1, 2, 1] 4 2
📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest
728x90
반응형
LIST