[ ALGORITHM ]/[ 백 준 ]

[BAEKJOON] 2798번 블랙잭

HiStar__ 2020. 6. 12. 16:54

문  제

 

소 스  코 드

#include <iostream>


const int BlackJack();

int main() {

	std::cout << BlackJack() << std::endl;

	return 0;
}

const int BlackJack() {
	short N;
	int M;

	while (true) {
		std::cin >> N >> M;

		if (3 <= N && 100 >= N) {
			if (10 <= M && 300'000 >= M) {
				break;
			}
		}
		std::cout << " Input Again " << std::endl;
	}

	int *num{ new int[N] };

	for (short i = 0; i < N; ++i) {
		std::cin >> num[i];
	}

	short first_card		{ 0 };
	short second_card		{ 1 };
	short third_card		{ 2 };

	int temp_num			{ 0 };
	int max_num				{ 0 };
	while (true) {

		temp_num = num[first_card] + num[second_card] + num[third_card];

		if (temp_num <= M && max_num < temp_num) max_num = temp_num;

		++third_card;
		if (third_card > N - 1) {
			++second_card;
			third_card = second_card + 1;
			if (second_card > N - 2) {
				++first_card;
				second_card = first_card + 1;
				third_card = second_card + 1;

				if (first_card > N - 3) {
					break;
				}
			}
		}
	}

	delete[] num;

	return max_num;
}

 

풀 이

N( 3 ≤ N ≤ 100 ) 
M( 10 ≤ M ≤ 300'000 ) 

 

카드 3장을 뽑아야 하고 A B C 모든 경우의 수를 확인해야 한다.

만약, 5장의 카드가 있을 경우. 이 경우에서 3장의 카드를 확인 한다면,

0 1 2 3 4

1. 0 1 2 

2. 0 1 3

3. 0 1 4

 

4. 0 2 3

5. 0 2 4

 

6. 0 3 4

 

7. 1 2 3

8. 1 2 4

 

9. 1 3 4

 

10. 2 3 4

 

총. 10가지 경우의 수가 나오는데 확인을 해보면 일정한 규칙을 알 수 있다. 

3번째 뽑은 카드가 마지막에 있는 카드가 될 경우.

2번째 카드가 뒤에서 두 번째 있는 카드가 될 경우.

그리고 중복을 방지하기 위하여 앞에 있는 카드의 숫자에 하나를 더한 것을 볼 수 있다.

 

3장의 뽑은 카드에 덧셈을 통해 결과 값을 비교 저장하면 된다.

 

 

결 과 값

 

 

문 제  출 처

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

 

'[ ALGORITHM ] > [ 백 준 ]' 카테고리의 다른 글

[BAEKJOON] 9663번 N-Queen  (0) 2020.06.17
[BAEKJOON] 15652번 N과 M (4)  (0) 2020.06.16
[BAEKJOON] 15651번 N과 M (3)  (0) 2020.06.15
[BAEKJOON] 15650번 N과 M (2)  (0) 2020.06.14
[BAEKJOON] 15649번 N과 M (1)  (0) 2020.06.13