문 제
소 스 코 드
#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 |