🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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, 0, 0);
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(0, 0); // 뽑은 갯수, 결과
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(0, 0); // 뽑은 갯수, 결과
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
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Lv. 2] 게임 맵 최단거리 (JAVA) (0) | 2023.09.14 |
---|---|
[프로그래머스/Lv. 3] 네트워크 (JAVA) (0) | 2023.09.14 |
[프로그래머스/Lv. 2] 피로도 (JAVA) (0) | 2023.09.13 |
[프로그래머스/Lv. 2] 소수 찾기 (JAVA) (0) | 2023.09.13 |
[프로그래머스/Lv. 2] n^2 배열 자르기 (JAVA) (0) | 2023.09.13 |