-
✅ 문제 설명
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 입출력 예 #1
✅ 입출력 예 #1
문제 예시와 같습니다.
✅ 입출력 예 #2
+4+1-2+1 = 4 +4-1+2-1 = 4
* 총 2가지 방법이 있으므로, 2를 return 합니다.
⚠️ 문제 접근 Point
1. 어떤 경우의 수가 나올 수 있는지 그려보면 이해가 빠르다.
입출력의 예로 나온 문제를 그림으로 그려, 보다 이해가 쉽도록 정리해보았다.
이때, 왼쪽 노드의 경우 + / 오른쪽 노드의 경우 - 의 원칙을 가질 수 있도록 구성하였다.
why? + / - 두 가지 경우밖에 존재하지 않기 때문이다. / "순서를 바꾸지 않고 적절히 더하거나 빼서" 라는 문제의 의도 파악
✅ 구현코드
class Solution { int[] numbers; int target; int answer; public int solution(int[] numbers, int target) { answer = 0; this.numbers = numbers; this.target = target; dfs(0,0); return answer; } void dfs (int index, int sum){ if(index == numbers.length){ if(sum == target) answer++; return; } dfs(index + 1, sum + numbers[index]); dfs(index + 1, sum - numbers[index]); } }
✅ 같이 생각해보면 좋을 부분
1. dfs의 작동 원리
2. 해당 코드의 디버깅 과정
'스터디' 카테고리의 다른 글
[Day06] [프로그래머스][LV2] 기능개발 (0) 2024.02.09 [Day05] [프로그래머스][LV3] 베스트앨범 (0) 2024.01.26 [Day04] "사내 스터디 1기" 2회차 회고 (3) 2024.01.16 [Day03] [프로그래머스][LV2] 전화번호 목록 (2) 2024.01.09 [Day01] "사내 스터디 1기" 개설 (1) 2023.11.26 댓글