https://programmers.co.kr/learn/courses/30/lessons/43165?language=java
프로그래머스 타겟 넘버 문제입니다.
문제의 의도는 DFS를 활용한 풀이인것 같습니다.
그러나 처음에 연산자의 조합을 구해서 문제를 푸려고 시도했고 그 과정에서 많은 고민도 했네요..
연산자의 조합을 이용한 풀이
조합의 경우 순서를 신경쓰지 않아도 되지만 이 풀이에서는 조합의 순서를 신경써야 합니다.
public class 타겟넘버 {
class Solution {
int cnt =0;
boolean[] visited;
public int solution(int[] numbers, int target) {
visited = new boolean[numbers.length];
for(int i=0; i<numbers.length; i++){
visited = new boolean[numbers.length];
comb(0, i+1, numbers.length, target,numbers);
}
return cnt;
}
public void comb(int start, int depth, int length, int target, int[] numbers) {
if(start == depth){
int sum = 0;
for(int i=0; i<length; i++){
if(visited[i]){
sum += numbers[i];
} else {
sum -= numbers[i];
}
}
if(sum == target){
cnt++;
}
return;
}
for(int i=start; i<numbers.length; i++){
visited[i] = true;
comb(i+1,depth, length,target,numbers);
visited[i] = false;
}
}
}
}
DFS를 활용한 풀이
훨씬 풀이가 간단합니다.
+, - 의 두가지 연산만 존재하기 때문에 한쪽은 두개로 뿌리를 나누어서 푸는 방법입니다.
public class 타겟넘버3 {
class Solution {
int answer = 0;
public int solution(int[] numbers, int target) {
dfs(target, numbers, 0, 0);
return answer;
}
void dfs(int target, int[] numbers, int n, int sum){
if(n == numbers.length){
if(sum == target){
answer++;
}
}
dfs(target, numbers, n+1, sum+numbers[n]);
dfs(target, numbers, n+1, sum-numbers[n]);
}
}
}
'알고리즘' 카테고리의 다른 글
프로그래머스 - JadenCase 문자열 만들기 (0) | 2020.08.11 |
---|---|
프로그래머스 - 단어변환(DFS) (1) | 2020.05.31 |
프로그래머스 - 네트워크(DFS/BFS 두가지 풀이 법) (0) | 2020.05.30 |
백준 16236 - 아기상어 (0) | 2020.05.11 |
백준 17779 - 게리멘더링 2 (2) | 2020.05.11 |