본문 바로가기
백준

[백준] 2798번 : 블랙잭 – JAVA [자바]

by Hongwoo 2022. 7. 10.
반응형

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

 

2798번: 블랙잭

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 2798번 블랙잭은 브론즈 2 난이도의 브루트 포스 문제이다. 이 문제는 먼저 카드의 개수 N과 넘지 말아야 되는 수 M이 주어진다. 그리고 N개 카드 중에 3장을 써서 M과 최대한 가깝게 만드는 세 수의 합을 구해야 한다.

 

이 문제는 브루트 포스 문제이다. 즉, 3장의 카드를 쓰면서 가능한 모든 조합을 해야 한다는 것이다. 이 문제는 삼중 for-loop을 이용해서 풀 수 있다. 

 

우선 맨 바깥에 있는 for-loop은 int i = 0부터 N - 2까지, 그리고 중간에 있는 for-loop은 int j = i + 1부터 N - 1까지, 그리고 안에 있는 for-loop은 int k = j + 1부터 N까지 돌린 다음에 모든 수를 더해주면 된다.

 

자세한 코드는 밑에 있는 코드를 참고하면 되겠다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    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 max = 0;
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        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 = arr[i] + arr[j] + arr[k];  //세 수의 합
                    if (sum <= m) {  //합이 m보다 작으면 갱신할 수 있는지 확인
                        max = Math.max(max, sum);
                    }
                }
            }
        }
        System.out.print(max);
    }
}

 

 

반응형

댓글