반응형
🔺 문제
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
🔺 코드
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
31
32
33
34
35
36
37
38
39
|
import java.util.*;
import java.io.*;
public class Main {
static int N, goal, ans;
static int[] A;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
goal = Integer.parseInt(st.nextToken());
// 입력받기
A = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
// 백트래킹
dfs(0, 0);
System.out.println(ans);
}
private static void dfs(int cur, int tot) {
if(cur == N) return; // 끝까지 돌았을 때
else {
if(A[cur] + tot == goal) {
ans++;
}
// 부분수열, 현재 위치의 원소를 선택하거나 / 선택하지 않거나
dfs(cur + 1, tot); // 다음 인덱스로 넘어가기
dfs(cur + 1, tot + A[i]); // 다음 인덱스로 넘겨주고 & 현재 위치 원소 선택
}
}
}
|
cs |
✅ 해결 아이디어
✔ 백트래킹 : 현재 상태에서 가능한 모든 후보군을 따라 들어가며 탐색하는 알고리즘
- 매 순간 수를 더할지 / 말지를 통해 부분 수열의 합 계산 가능!
함수 인자로 현재까지의 함 (tot)도 함께 가져가게
🔺 다른 풀이들
- 깔끔한 풀이ㅠㅠ
로그인
www.acmicpc.net
💬 느낀 점
후엥 백트래킹 다시 머릿속에 집어넣어야 함
N과 M시리즈 다시 풀어~~
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 8.23 |
(+ 2회독 8.23)
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
31
32
33
34
35
36
37
38
|
import java.util.*;
import java.io.*;
public class Main {
static int N, S, cnt;
static int[] A;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
S = Integer.parseInt(st.nextToken());
A = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
backtracking(0, 0);
if(S == 0) cnt--; // S가 0인 경우, 공집합 제거
System.out.println(cnt);
}
private static void backtracking(int tmp, int tot) {
if(tmp == N) {
if(tot == S) {
cnt++;
}
return;
}
backtracking(tmp + 1, tot); // 현재 위치 원소 선택 X, 다음 인덱스로 넘어감
backtracking(tmp + 1, tot + A[tmp]); // 현재 위치 원소 선택 O, 다음 인덱스로 넘어감
}
}
|
cs |
인자를 들고 가는 이 형식을 기억하좌,,,,!!
(참고)
✔ 풀이
https://log-laboratory.tistory.com/119
https://we1cometomeanings.tistory.com/266
✔ 백트래킹
[실전 알고리즘] 0x0C강 - 백트래킹
이번에는 백트래킹을 배워보도록 하겠습니다. 백트래킹도 재귀와 더불어 많은 사람들이 고통을 호소하는 알고리즘 중 하나이지만 의외로 그 재귀적인 구조에 매료되어서 참재미를 알아버리는
blog.encrypted.gg
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 2583번: 영역 구하기 (0) | 2023.07.19 |
---|---|
[백준/JAVA] 2644번: 촌수계산 (0) | 2023.07.19 |
[백준/JAVA] 10451번: 순열 사이클 (0) | 2023.07.18 |
[백준/JAVA] 1531번: 투명 (0) | 2023.07.18 |
[백준/JAVA] 1271번: 엄청난 부자2 (0) | 2023.07.17 |