π§© Baekjoon 2798 - λΈλμ
λ¬Έμ
μΉ΄μ§λ Έμμ μ μΌ μΈκΈ° μλ κ²μ λΈλμμ κ·μΉμ μλΉν μ½λ€. μΉ΄λμ ν©μ΄ 21μ λμ§ μλ νλ λ΄μμ, μΉ΄λμ ν©μ μ΅λν ν¬κ² λ§λλ κ²μμ΄λ€. λΈλμμ μΉ΄μ§λ Έλ§λ€ λ€μν κ·μ μ΄ μλ€. νκ΅ μ΅κ³ μ λΈλμ κ³ μ κΉμ μΈμ μλ‘μ΄ λΈλμ κ·μΉμ λ§λ€μ΄ μκ·Ό, μ°½μμ΄μ κ²μνλ €κ³ νλ€.
κΉμ μΈ λ²μ μ λΈλμμμ κ° μΉ΄λμλ μμ μ μκ° μ°μ¬ μλ€. κ·Έ λ€μ, λλ¬λ Nμ₯μ μΉ΄λλ₯Ό λͺ¨λ μ«μκ° λ³΄μ΄λλ‘ λ°λ₯μ λλλ€. κ·Έλ° νμ λλ¬λ μ«μ Mμ ν¬κ² μΈμΉλ€. μ΄μ νλ μ΄μ΄λ μ νλ μκ° μμ Nμ₯μ μΉ΄λ μ€μμ 3μ₯μ μΉ΄λλ₯Ό 골λΌμΌ νλ€. λΈλμ λ³ν κ²μμ΄κΈ° λλ¬Έμ, νλ μ΄μ΄κ° κ³ λ₯Έ μΉ΄λμ ν©μ Mμ λμ§ μμΌλ©΄μ Mκ³Ό μ΅λν κ°κΉκ² λ§λ€μ΄μΌ νλ€.
Nμ₯μ μΉ΄λμ μ¨μ Έ μλ μ«μκ° μ£Όμ΄μ‘μ λ, Mμ λμ§ μμΌλ©΄μ Mμ μ΅λν κ°κΉμ΄ μΉ΄λ 3μ₯μ ν©μ κ΅¬ν΄ μΆλ ₯νμμ€.
μ λ ₯
첫째 μ€μ μΉ΄λμ κ°μ N(3 β€ N β€ 100)κ³Ό M(10 β€ M β€ 300,000)μ΄ μ£Όμ΄μ§λ€. λμ§Έ μ€μλ μΉ΄λμ μ°μ¬ μλ μκ° μ£Όμ΄μ§λ©°, μ΄ κ°μ 100,000μ λμ§ μλ μμ μ μμ΄λ€. ν©μ΄ Mμ λμ§ μλ μΉ΄λ 3μ₯μ μ°Ύμ μ μλ κ²½μ°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
μΆλ ₯
첫째 μ€μ Mμ λμ§ μμΌλ©΄μ Mμ μ΅λν κ°κΉμ΄ μΉ΄λ 3μ₯μ ν©μ μΆλ ₯νλ€.
μμ
β μ λ ₯ 1
1
2
5 21
5 6 7 8 9
β μΆλ ₯ 1
1
21
β μ λ ₯ 2
1
2
10 500
93 181 245 214 315 36 185 138 216 295
β μΆλ ₯ 2
1
497
μμ± μ½λ
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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
// μ μ λ³μ
static int n, m;
static int[] numArr;
static int result;
// λ°± νΈλνΉ μ²λ¦¬ λ©μλ
static void backtracking(int start, int depth, int sumValue) {
// m μ΄κ³Ό μ μ’
λ£
if (sumValue > m) return;
// 3κ° μΆ©μ‘± μ κ²°κ³Ό κ³μ° λ° μ’
λ£
if (depth == 3) {
result = Math.max(result, sumValue);
return;
}
// λ°± νΈλνΉ
for (int i = start; i < n; i++) {
backtracking(i + 1, depth + 1, sumValue + numArr[i]);
}
}
// λ©μΈ λ©μλ
public static void main(String[] args) throws IOException {
// 1. λ³μ μ μΈ λ° μ΄κΈ°ν
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st1 = new StringTokenizer(br.readLine());
StringTokenizer st2 = new StringTokenizer(br.readLine());
n = Integer.parseInt(st1.nextToken());
m = Integer.parseInt(st1.nextToken());
numArr = new int[n];
result = 0;
int i = 0;
while (st2.hasMoreTokens()) {
numArr[i++] = Integer.parseInt(st2.nextToken());
}
// 2. λ°± νΈλνΉ
backtracking(0, 0, 0);
// 3. μΆλ ₯
System.out.println(result);
}
}
Back-tracking
μ μ΄μ©ν΄μ νμλ€.
νκ³
- μ‘°ν© λ¬Έμ μ κ²½μ°
start
μdepth
λ³μμ μν μ λΆλͺ νκ² λΆλ¦¬ν΄μΌ νλ€λ μ¬μ€μ μκ² λμλ€.