코테/프로그래머스

[프로그래머스/Lv. 2] 타겟 넘버 (JAVA)

imname1am 2023. 9. 13. 23:00
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.*;
import java.io.*;
 
class Solution {    
    static int answer = 0;
    
    public int solution(int[] numbers, int target) {
        
        dfs(numbers, target, 00);
        
        return answer;
    }
    
    private static void dfs(int[] numbers, int target, int depth, int sum) {
        if(depth == numbers.length) { // 종료 조건 : 마지막 노드까지 탐색했을 때
            if(target == sum) answer++;
        }
        else {
            dfs(numbers, target, depth + 1, sum + numbers[depth]);  // 해당 노드 값을 더하고 다음 값 탐색
            dfs(numbers, target, depth + 1, sum - numbers[depth]);  // 해당 노드 값을 빼고   다음 값 탐색
        }
    }
}
cs
✅ 해결 아이디어
DFS / BFS
- 탐색할 노드가 남아있는 경우, 이전까지의 노드의 합에서 현재 값을 [더하는  / 빼는] 경우 2가지 경우로 DFS 실행

 

 


🔺 다른 풀이들

- BFS를 활용하셨다

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    static Queue<Integer> q = new LinkedList<Integer>();
    public int solution(int[] numbers, int target) {
        int answer = 0;
        
        q.offer(0);
        q.offer(0);
        
        while(q.peek()!=null){
            int level = q.poll();
            int v = q.poll();
            
            if(level == numbers.length){
                if(v == target)
                    answer++;
            }
            else {
                q.offer(level + 1);
                q.offer(v + numbers[level]);

                q.offer(level + 1);
                q.offer(v - numbers[level]);
            }
        }
        return answer;
    }   
}

 

 

- 천재인가..

class Solution {
    public int solution(int[] numbers, int target) {
        int answer = 0;
        answer = dfs(numbers, 0, 0, target);
        return answer;
    }
    int dfs(int[] numbers, int n, int sum, int target) {
        if(n == numbers.length) {
            if(sum == target) {
                return 1;
            }
            return 0;
        }
        return dfs(numbers, n + 1, sum + numbers[n], target) + dfs(numbers, n + 1, sum - numbers[n], target);
    }
}

 


💬 느낀 점

DFS에서 경우의 수를 이렇게 분리하는 케이스를 잊지 말아야겠다.

이런 정답 형식 코드를 자주 안 풀다 보니까 자꾸 이 코드 형식을 까먹는다

 

1회독 2회독 3회독 4회독 5회독
V 10.12 10.25    

 

 

(+ 2회독 10.12)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;
 
class Solution {
    static int[] numbers;
    static int target;
 
    static int cnt = 0;
    
    public int solution(int[] numbers, int target) {
        this.numbers = numbers;
        this.target = target;
        
        dfs(00);  // 뽑은 갯수, 결과
        return cnt;
    }
    
    private static void dfs(int depth, int sum) {
        if(depth == numbers.length) {
            if(target == sum) cnt++;
        }
        else {
            dfs(depth + 1, sum + numbers[depth]);   // 해당 노드 값을 더하고 다음 깊이 탐색
            dfs(depth + 1, sum - numbers[depth]);   // 해당 노드 값을 빼고   다음 깊이 탐색
        }
    }
}
cs

 

 

(+ 10.25 3회독)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.*;
 
class Solution {
    static int[] numbers;
    static int target;
    static int cnt = 0;
    
    public int solution(int[] numbers, int target) {
        this.numbers = numbers;
        this.target = target;
        
        dfs(00);    // 뽑은 갯수, 결과
        
        return cnt;
    }
    
    private static void dfs(int depth, int sum) {
        if(depth == numbers.length) {
            if(sum == target) {
                cnt++;
            }
            return;
        }
 
        // 현재 숫자를 더한 / 뺀 경우로 나눠 재귀 호출
        dfs(depth + 1, sum + numbers[depth]);
        dfs(depth + 1, sum - numbers[depth]);
 
    }
}
cs


(참고)

✔ 풀이 참고

 

[프로그래머스] 타겟 넘버 - Java

https://programmers.co.kr/learn/courses/30/lessons/43165 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로

hyojun.tistory.com

 

✔ 그림 설명 이해용

 

[Java 자바] 프로그래머스> Lv.2 타겟 넘버

https://programmers.co.kr/learn/courses/30/lessons/43165?language=java 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들

yeoeun-ji.tistory.com

 

[Java] 타겟 넘버 - Lv2 프로그래머스 깊이 우선 탐색(DFS)

https://school.programmers.co.kr/learn/courses/30/lessons/43165 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

mag1c.tistory.com

 

반응형