PS (C, C++)

[백준/C & C++] 2798 블랙잭

최연재 2022. 10. 4. 10:28

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

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

코드 (C)

#include <stdio.h>
int main()
{
	int a, max, sum, result=0, arr[101];
	scanf("%d %d", &a, &max);
	for (int i = 0; i < a; i++) scanf("%d", &arr[i]);
	for (int i = 0; i < a - 2; i++)
	{
		for (int j = i + 1; j < a - 1; j++)
		{
			for (int k = j + 1; k < a; k++)
			{
				sum = arr[i] + arr[j] + arr[k];
				if (sum <= max && sum > result) result = sum;
			}
		}
	}
	printf("%d", result);
	return 0;
}

코드 (C++)

#include <iostream>
using namespace std;

int main()
{
	int a, max, num[101], result=0, sum;
	cin >> a >> max;

	for (int i = 0; i < a; i++) cin >> num[i];

	for (int i = 0; i < a - 2; i++)
	{
		for (int j = i+1; j < a - 1; j++)
		{
			for (int k = j+1; k < a; k++)
			{
				sum = num[i] + num[j] + num[k];
				if (sum <= max && sum > result) result = sum;
			}
		}
	}
	cout << result;
	return 0;
}

코드설명 

카드의 개수와 M(==max)을 입력받는다. 

이후 반복문으로 카드의 개수만큼 카드에 쓰여있는 수를 입력받는다. 

 

다시 반복문을 도는데, 합이 max를 넘지 않는 카드 3장의 합을 구해야 하므로 반복문을 중첩하고 한 번 더 중첩해서 총 3개의 반복문으로 모든 경우를 탐색한다. 

 

합이 max를 넘지 않으면서 이전의 최댓값보다 큰 경우 값을 바꾼다. 

이후 반복문이 종료된 후 결과를 출력한다. 

느낀 점

일단 어떻게 짜야할지 구상은 했는데, 값을 구해나가는 과정을 조금 고민했다. 반복문이 한 번만 중첩돼서 이중 for문을 돌아도 시간이 꽤 걸릴 텐데, 시간초과가 되진 않을까 걱정했다. 일단 해보고 실패하면 다른 방법을 찾아볼 생각이었는데, 다행히도 한 번에 통과했다! 

'PS (C, C++)' 카테고리의 다른 글

[백준/C & C++] 11050 이항 계수 1  (2) 2022.10.05
[백준/C & C++] 2914 저작권  (2) 2022.10.04
[백준/C & C++] 5354 J박스  (0) 2022.10.04
[백준/C & C++] 2576 홀수  (0) 2022.09.19
[백준/C & C++] 1233 주사위  (0) 2022.09.19