[Java] 프로그래머스 DFS/BFS > 타겟 넘버 자바
프로그래머스 > DFS/BFS > 타겟넘버
https://programmers.co.kr/learn/courses/30/lessons/43165?language=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 이하인 자연수입니다.
입출력 예
numbers | target | return |
---|---|---|
[1, 1, 1, 1, 1] | 3 | 5 |
[4, 1, 2, 1] | 4 | 2 |
생각하기
말이 네트워크지 쉽게 이해하자면 그냥 간선으로 이동할 수 있는 노드들은 1로 계산하고 따로 떨어져있는 노드들도 1로 계산해서 모두 더하면 되는 문제였다.
computers[][]
배열이 2차원 배열이지만 사실 자기자신을 경계로 봤을 때,
아랫면이든 윗면이든 한쪽만 보면된다.
그래서 visit[]
배열을 computers.length
의 길이 만큼 1차원 배열로 생성해주면 된다.
DFS
재귀를 이용하여 구현을 해봤다.
+와 -의 조합으로 이루어지기 때문에 2개의 조합으로만 구성된다.
index
는 어차피 숫자가 계속 누적되면서 쌓이고 부호만 바뀌기 때문에
index
는 + 1은 변하지 않는다.
다음은 sum
에서 +와 - 기호를 구분하기 위해
sum + numbers[index]
sum - numbers[index]
로 2가지로만 구분하면된다.
이렇게 되면 재귀를 하면서 각 숫자에 대한 + - 조합을 모두 해보면서
target
과 같은 숫자일 경우 answer
이 증가하여
원하는 값을 출력할 수 있다.
탈출 조건은 numbers
배열을 넘어가면 안되기 때문에 index
값을 numbers
배열의 길이와 같아질 경우 return 시키도록 설정해주었다.
TMI
복잡하지 않는 내용인데 2번째 부터 돌아가는 재귀는 항상 머리가 복잡해진다.
손으로 직접쓰는게 최고!
코드
DFS 사용
class Solution {
static int numbers[];
static int target;
static int answer = 0;
static int length;
public int solution(int[] numbers, int target) {
this.numbers = numbers;
this.target = target;
this.length = numbers.length;
DFS(0, 0);
return answer;
}
static void DFS(int index, int sum) {
// 탈출 조건
if(index == length) {
if(sum == target) answer++;
return;
}
// 수행 동작
DFS(index + 1, sum + numbers[index]);
DFS(index + 1, sum - numbers[index]);
}
}
Author And Source
이 문제에 관하여([Java] 프로그래머스 DFS/BFS > 타겟 넘버 자바), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@lifeisbeautiful/Java-프로그래머스-DFSBFS-타겟-넘버-자바
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class Solution {
static int numbers[];
static int target;
static int answer = 0;
static int length;
public int solution(int[] numbers, int target) {
this.numbers = numbers;
this.target = target;
this.length = numbers.length;
DFS(0, 0);
return answer;
}
static void DFS(int index, int sum) {
// 탈출 조건
if(index == length) {
if(sum == target) answer++;
return;
}
// 수행 동작
DFS(index + 1, sum + numbers[index]);
DFS(index + 1, sum - numbers[index]);
}
}
Author And Source
이 문제에 관하여([Java] 프로그래머스 DFS/BFS > 타겟 넘버 자바), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lifeisbeautiful/Java-프로그래머스-DFSBFS-타겟-넘버-자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)