타겟 넘버
https://programmers.co.kr/learn/courses/30/lessons/43165
문제 설명
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 |
입출력 예 설명
문제에 나온 예와 같습니다.
구해야 하는 것은 배열 numbers 안의 숫자들을 +와 -로 조합하여 합한 값이 target이 나오는 방법의 수이다.
DFS(깊이 우선 탐색)으로 풀어본다.
DFS는 Stack과 재귀 호출을 사용하여 풀 수 있다.
재귀 호출 함수를 사용하여 풀어보자.
+와 -를 그래프로 친다면 +는 왼쪽, -는 오른쪽으로 간다고 가정한다.
시작 노드는 0으로 친다.
class Solution {
static int answer = 0;
public int solution(int[] numbers, int target) {
dfs(numbers,target,0);
return answer;
}
public static void dfs(int[] numbers, int target, int node){
if(node == numbers.length){
int sum = 0;
for(int i = 0; i<numbers.length; i++){
sum += numbers[i];
}
if(sum == target){
answer++;
return;
}
}else{
numbers[node] *= 1;
dfs(numbers,target,node + 1);
numbers[node] *= -1;
dfs(numbers,target,node + 1);
}
}
}
dfs의 첫 노드 값은 0으로 주었다.
노드 값이 배열의 길이와 같을 땐 모든 탐색을 끝낸 것이니 합을 해준다.
합을 해준 값이 target과 일치할 땐 answer에 1을 추가해준다.
아닐 경우엔 +와 -를 붙여서 재귀 호출을 한다.
Github 주소
https://github.com/MIN-04/CodingTest/blob/master/Programmers/PracticeKit/DFS_BFS/No43165.java
MIN-04/CodingTest
코딩테스트 준비 / 문제 풀이. Contribute to MIN-04/CodingTest development by creating an account on GitHub.
github.com
'코딩테스트 준비 > 프로그래머스' 카테고리의 다른 글
Programmers [고득점 Kit - 스택/큐] Java 풀이 : 주식가격 (0) | 2020.08.26 |
---|---|
Read Me - 프로그래머스 (0) | 2020.08.26 |