개발 일기

백준 2798번 문제풀이 - 블랙잭 본문

백준 문제풀이

백준 2798번 문제풀이 - 블랙잭

종현종현 2021. 11. 29. 10:53

백준 2798번 문제

 

 

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

 

2798번: 블랙잭

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

www.acmicpc.net

 

N, M을 입력하면 N장의 카드 중 3장을 골라 M보다 작거나 같으면서 가장 큰 수가 출력되게 하는 문제이다.

모든 조합을 다 해봐야 되기 때문에 해볼 수 있는 경우의 수를 for문으로 다 조합하도록 했다.

 

 

 

 

 

코딩

 

public class Blackjack {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int max = 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++) {
                    // 3장의 카드 합
                    int bj = arr[i] + arr[j] + arr[k];
                    if (bj == M) { // M이면 max에 저장
                        max = bj;
                    }
                    if (max < bj && bj < M) { // 그 전의 조합보다 크면 저장
                        max = bj;
                    }
                }
            }
        }
        System.out.println(max);
    }
}

 

 

 

 

 

결과

 

 

 

 

 

 

느낀 점

 

문제 자체는 그렇게 어렵지 않았지만 빼먹지 않는 경우의 수를 생각하며 for문을 만드는데 생각보다 오래 걸렸다. 이런 경우의 알고리즘을 자주 해보면서 익숙해지는 게 중요할 것 같다.

Comments