Post

🧩 Baekjoon 2798 - λΈ”λž™μž­

🧩 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 λ³€μˆ˜μ˜ 역할을 λΆ„λͺ…ν•˜κ²Œ 뢄리해야 ν•œλ‹€λŠ” 사싀을 μ•Œκ²Œ λ˜μ—ˆλ‹€.
This post is licensed under CC BY 4.0 by the author.