반응형
📖 문제
https://www.acmicpc.net/problem/18429
💡 풀이 방식
• DFS (조합)
백트래킹으로 운동 키트 번호를 뽑는다. (중복 X)
뽑은 운동 키트를 순서대로 돌면서, 중량이 모두 500 이상인 경우만 정답 +1을 한다.
🔺 코드
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import java.util.*;
import java.io.*;
public class Main {
static int N,K,answer;
static int[] arr;
static boolean[] chk;
static List<Integer> list = new ArrayList<>(); // 뽑은 운동 키트의 중량 증가량 저장 리스트
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());
K = Integer.parseInt(st.nextToken());
arr = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
chk = new boolean[N];
dfs(0, 0);
System.out.println(answer);
}
private static void dfs(int idx, int depth) {
if(depth == N) {
int weight = 500;
for(int i : list) {
weight = weight - K + i;
if(weight < 500) // 중량이 500 미만이라면 종료
return;
}
answer++; // 운동 기간 동안 항상 중량이 500 이상이면 경우의 수 +1
return;
}
for(int i = 0 ; i < N ; i++) {
if(!chk[i]) {
chk[i] = true;
list.add(arr[i]);
dfs(i + 1, depth + 1);
chk[i] = false;
list.remove(list.size() - 1);
}
}
}
}
|
cs |
➕ 다른 풀이 방식
백트래킹 함수 변수에 중량을 들고 다니면서 계산하셨다.
[백준] 18429번 근손실 - Java, 자바
난이도 실버 3 문제 https://www.acmicpc.net/problem/18429 풀이 백트래킹 사용 1) 틀린 코드 풀이 ex) n=3, k=4, 운동키트번호(중량증가량) 1(3),2(7),3(5) 키트를 사용할 수 있는 경우의 수를 구하기 위해 백트래
velog.io
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 10431번: 줄세우기 (0) | 2024.06.12 |
---|---|
[백준/JAVA] 1240번: 노드사이의 거리 (1) | 2024.06.11 |
[백준/JAVA] 10709번: 기상캐스터 (1) | 2024.06.08 |
[백준/JAVA] 14002번: 가장 긴 증가하는 부분 수열 4 (1) | 2024.06.07 |
[백준/JAVA] 2118번: 두 개의 탑 (0) | 2024.06.06 |