본문 바로가기

코딩/백준 BOJ

[백준/C언어] 2798번 - 블랙잭

백준 웹사이트 "2798번 - 블랙잭" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

2798번: 블랙잭

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

www.acmicpc.net


소스 코드

#include <stdio.h>

int main(void){
    int N, M;
    scanf("%d %d", &N, &M);

    int cards[N];
    for(int num=0; num<N; num++){
        scanf("%d", &cards[num]);
    }

    int blackjack=0;
    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++){
                int sum = cards[i]+cards[j]+cards[k];
                if(sum>blackjack && sum<=M)
                    blackjack = sum;
            }
        }
    }
    printf("%d\n", blackjack);
}

문제 풀이

  모든 경우를 하나하나, 빠짐없이 확인하는 방법인 '브루트포스 알고리즘'을 연습하는 문제입니다. 브루트포스 알고리즘의 경우, 풀이는 굉장히 쉽습니다. Line 7 ~ 10은 N장의 카드를 입력하는 단계로, 배열 'cards'에 각각의 카드를 입력합니다. Line 13 ~ 21에서는 가능한 3장의 조합을 모두 시도해보며, M과 가장 가까운 합을 변수 'blackjack'에 저장합니다. 모든 for문이 종료되면, blackjack에 마지막으로 저장된 수를 출력합니다.

반응형