minimimi

[백준] 2798 블랙잭 본문

프로그래밍 공부/알고리즘

[백준] 2798 블랙잭

99mini 2019. 7. 30. 23:10
반응형

문제링크] https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버젼의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게

www.acmicpc.net


문제요약

N개의 숫자가 주어졌을 때 3장의 숫자를 골라 모두 더하였을 때, 그 값이 M을 넘지 않고 M과 가장 가까운 값을 구하는 문제입니다.

풀이

브루트 포스 알고르즘 문제입니다. 모든 경우의 수를 계산하여 M에 가까운 값을 찾는 알고리즘을 구현하면 됩니다. 이 알고리즘의 경우에는 for문이 3번이 중첩 되어서 시간복잡도가 O(N^3) 으로 매우 크지만 문제의 조건에서 N이 100이하이기 때문에 최악의 경우 10^6 번의 반복이 이루어집니다. 10^6은 컴퓨터가 계산하기에 매우 큰 수는 아니므로 알고리즘을 푸는데 큰 지장은 없습니다. 

 

코드는 c/c++로 작성되었습니다.

#include <iostream>

using namespace std;

int arr[101];

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

int main() {
	int num, max;
	cin >> num;
	cin >> max;

	for (int i = 0; i < num; i++) {
		cin >> arr[i];
	}

	cout << blackJeck(arr, num, max);
	

	return 0;
}
반응형

'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글

[백준] 10773 제로  (0) 2019.08.06
[백준] 2902 KMP는 왜 KMP일까?  (0) 2019.07.31
[백준] 2231 분해합  (0) 2019.07.30
[백준] 11727 2 x n 타일링 2  (0) 2019.07.30
[백준] 11726 2 x n 타일링  (0) 2019.07.30