[JAVA] 블랙잭

NoHae·2025년 3월 17일

백준

목록 보기
19/106

문제 출처

단계별로 풀어보기 > 브루트 포스 > 블랙잭
https://www.acmicpc.net/problem/2798

문제 설명

N개의 카드가 주어질 때, 3장을 뽑아 M이 넘지 않는 최댓값을 출력하라.

접근 방법

같은 카드를 선택하지 않게 3중 for문에서 if문을 통해 이 전에 선택한 카드는 선택하지 않게 조건을 성립한다.
이 후, 가장 안쪽 for문에서 3장의 카드를 더해 최댓값일 경우 저장한다.

import java.io.*;
import java.util.StringTokenizer;

public class 블랙잭 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int arr[] = new int[N];

        st = new StringTokenizer(br.readLine());

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

        int max = 0;

        for(int j = 0; j<N; j++){
            int sum = 0;
            for(int k = 0; k<N; k++){
                if(j == k) continue;
                for(int l = 0; l<N; l++){
                    if( l == j || l == k) continue;
                    sum = arr[j] + arr[k] + arr[l];
                    if(sum > max && sum <= M){
                        max = sum;
                    }
                }
            }
        }
        bw.write(String.valueOf(max));
        bw.flush();
        bw.close();
        br.close();
    }

}

Review

import java.io.*;
import java.util.StringTokenizer;

public class 블랙잭_review {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int cards[]= new int[N];

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

        int max = 0;

        for(int j = 0; j<N; j++){
            int sum = 0;
            for(int k = j+1; k<N; k++){
                for(int l = k+1; l<N; l++){
                    sum = cards[j] + cards[k] + cards[l];
                    if(sum <= M && sum > max){
                        max = sum;
                    }
                }
            }
        }

        bw.write(String.valueOf(max));
        bw.flush();
        bw.close();
        br.close();

    }
}

알게된 점

3중 for문에서 굳이 j = 0, k = 0, l = 0을 초기값으로 설정하고 if문을 통해 중첩이 되는 경우를 제외하는 것이 아니라, 초기값을 j = 0, k = j+1, l = k+1 이라 설정하면 조건문을 작성하지 않아도 된다.

문제푼 흔적

profile
노력 해보려고 하는 사람(00년생 소프트웨어융합학과, 24년 12월 부터 백엔드 및 코테 공부 시작)

0개의 댓글