코딩테스트/알고리즘 문제

[프로그래머스] 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`: 지금까지의 합계
  • 재귀 함수를 통해 두 가지 선택지를 만듦:
    • 현재 숫자를 더하는 경우 (`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