μ•Œκ³ λ¦¬μ¦˜ 문제/BOJ_Java

[BOJ/Step11] 2798 : λΈ”λž™μž­ (JAVA)

NaNaRinπŸ™ƒ 2021. 1. 21. 11:28

www.acmicpc.net/problem/2798

 

2798번: λΈ”λž™μž­

첫째 쀄에 μΉ΄λ“œμ˜ 개수 N(3 ≤ N ≤ 100)κ³Ό M(10 ≤ M ≤ 300,000)이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” μΉ΄λ“œμ— μ“°μ—¬ μžˆλŠ” μˆ˜κ°€ 주어지며, 이 값은 100,000을 λ„˜μ§€ μ•ŠλŠ” μ–‘μ˜ μ •μˆ˜μ΄λ‹€. 합이 M을 λ„˜μ§€ μ•ŠλŠ” μΉ΄λ“œ 3μž₯

www.acmicpc.net


문제

μΉ΄μ§€λ…Έμ—μ„œ 제일 인기 μžˆλŠ” κ²Œμž„ λΈ”λž™μž­μ˜ κ·œμΉ™μ€ μƒλ‹Ήνžˆ 쉽닀. μΉ΄λ“œμ˜ 합이 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

5 21

5 6 7 8 9

 

예제 좜λ ₯ 1

21

 

예제 μž…λ ₯ 2

10 500

93 181 245 214 315 36 185 138 216 295

 

예제 좜λ ₯ 2

497


풀이

N개의 μΉ΄λ“œ 쀑 M을 λ„˜μ§€ μ•ŠλŠ” μ„Έ 개의 ν•©μ˜ μ΅œλŒ€κ°’μ„ κ΅¬ν•˜λŠ” 문제

1. λͺ¨λ“  경우의 수λ₯Ό 확인해야 ν•˜λ―€λ‘œ array[0] + array[1] + array[2] λΆ€ν„° array[n-3] + array[n-2] + array[n-1] κΉŒμ§€ λͺ¨λ‘ 확인할 수 μžˆλ„λ‘ ν•΄μ•Ό ν•œλ‹€.

2. array[0] + array[1] + array[2] -> array[0] + array[1] + array[3] -> … -> array[0] + array[1] + array[n-2] -> array[0] + array[1] + array[n-1] -> array[0] + array[2] + array[3] -> … -> array[0] + array[2] + array[n-2] -> array[0] + array[2] + array[n-1] -> … -> array[n-3] + array[n-2] + array[n-1] 순으둜 νƒμƒ‰ν•œλ‹€.

3. μ„Έ 숫자의 합을 κ΅¬ν• λ•Œλ§ˆλ‹€ μ„Έκ°œμ˜ 합이 max보닀 큰지, m을 λ„˜μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•˜μ—¬ μ €μž₯ν•œλ‹€

4. max 좜λ ₯

 

import java.io.*;
import java.util.StringTokenizer;

public class B2798 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		
		int[] array = new int[n];
		
		st = new StringTokenizer(br.readLine());
		for(int i = 0; i < n; i++) {
			array[i] = Integer.parseInt(st.nextToken());
		}
		
		int max = 0;
		for(int i = 0; i < n; i ++) {
			for(int j = i+1; j < n; j++) {
				for(int k = j+1; k < n; k++) {
					int a = array[i]+array[j]+array[k];
					max = a <= m && a > max ? a : max;
				}
			}
		}
		System.out.println(max);
	}
}