알고리즘/백준

백준 2798 블랙잭 c++ [컴공과고씨]

시간빌게이츠 2022. 3. 29. 10:18
반응형

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

 

2798번: 블랙잭

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

www.acmicpc.net

카드를 3장을 뽑아서 주어진 숫자를 넘지 않고 최대한 가깝게 만들어주면 되는 문제이다.

 

문제 풀이

1. 카드 입력을 받아 배열에 저장

2. 3중 포문을 이용하여 3장의 카드의 합을 구함.

3. (주어진 숫자) - (3장의 합) 의 절대값을 이전 값과 비교 그리고 3장의 합이 주어진 숫자보다 작은지 확인

4. 위 조건일 경우 ans에 저장하고 다음 3장의 합으로 넘어감

 

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cmath>
using namespace std;
int main(){
    int n, m, cards[101];
    cin >> n >> m;
    int sum = 0;
    int ans = 0;
    for (int i = 0; i < n;i++){
        cin >> cards[i];
    }
    for (int i = 0; i < n-2;i++){
        for (int j = i + 1; j < n - 1; j++){
            for (int k = j + 1; k < n; k++){
                sum += cards[i] + cards[j] + cards[k]; // 3장의 합
                if(abs(m-ans)>abs(m-sum) && m-sum >= 0){
                    // 더 가까운 값을 저장, 주어진 숫자를 넘으면 안됨
                    ans = sum;
                }
                sum = 0;
            }
        }
    }
    cout << ans;
    return 0;
// 9 min
cs

 

체감 난이도 걸린 시간 참고 사용 알고리즘
9min x 브루트 포스
(brute force)

 

반응형