• toc {:toc}

문제

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

좜처:https://www.acmicpc.net/problem/2798

풀이

μ’…λ§ŒλΆ 1 117 μ—μ„œ λ³Έ μ΅œλŒ€ 연속 λΆ€λΆ„ ꡬ간 합을 μ‘μš©ν•΄λ³΄λ € ν–ˆμœΌλ‚˜ λΆˆκ°€.

λ¬΄μ‹ν•˜κ²Œ ν’€μ–΄λ΄€λ‹€.

λͺ¨λ“  경우의 수λ₯Ό μ „λΆ€ κ²½μœ ν•΄ 합을 λΉ„κ΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν’€μ΄ν–ˆλ‹€.

#include <iostream>
 
using namespace std;
 
// λΈ”λž™μž­
// μ„Έ κ°€μ§€λ₯Ό 선택 -> M에 κ°€μž₯ κ°€κΉŒμš΄ 합을 좜λ ₯
// λͺ¨λ“  경우의 수 -> 100X99X98;
int cardNum[101];
 
int main()
{
	int n, m, num, max=0, sum=0;
	cin >> n >> m;
	for(int i=0; i<n; i++)
	{
		cin >> num;
		cardNum[i]=num;
	}
	
	for(int i=0; i<n; i++)
	{
		for(int j=i+1; j<n; j++)
		{
			for(int k=j+1; k<n; k++)
			{
				sum = cardNum[i]+cardNum[j]+cardNum[k];
				if(m>=sum&&max<sum)
					max = sum;
			}
		}
	}
	printf("%d\n", max);
				
	
	return 0;
}