코테/백준

[백준/JAVA] 2798번: 블랙잭

imname1am 2023. 4. 1. 15:35
반응형

🔺 문제

 

2798번: 블랙잭

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

www.acmicpc.net

 

🔺 코드

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

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[] arr = new int[n];	// 카드에 쓰여있는 수 넣을 배열
        int goal = Integer.parseInt(st.nextToken());	// 카드 합

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

        // 카드 3장의 합 저장할 리스트 생성 (브루트포스)
        List<Integer> list = new ArrayList<>();

        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++) {	// 세 번째 카드
                    list.add(arr[i] + arr[j] + arr[k]);	// 세 카드의 합
                }
            }
        }

        int diff = 300000;
        int answer = 0;
        for(int val : list) {
            if((val <= goal) && (goal - val) < diff) {
                diff = goal - val;
                answer = val;
            }
        }

        System.out.println(answer);
    }
}
✅ 해결 아이디어
- 브루트포스 → 3중 for문!
- 카드 3장의 합을 브루트포스로 계산해 리스트에 값을 저장.
- 리스트의 값(=카드 3장의 합)을 목표값과 비교
└ 목표값보다 작거나 같고, (목표값 - 합)이 현재 (목표값 - 값)인 diff 값 보다 작다면, diff를 이 값으로 갱신.
└ answer도 이 때의 카드 3장의 합 값 val로 설정.


🔺 다른 풀이들

- 풀이1)

브루트포스 방법과 백트래킹 방법을 이용해서 푸셨다!

 

 

- 풀이2)

 

백준 2798번 JAVA 자바 블랙잭 [브루트 포스]

카드의 개수 N (3

hellodoor.tistory.com

이 풀이를 보고 나니 나는 굳이 세 카드의 합을 저장할 리스트를 생성할 필요 없이,

삼중 for문 안에서 if문을 활용해 이전 근사치 변수와 비교하면 되는 것이었다...!

 

 

- 풀이3)

 

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

https://www.acmicpc.net/problem/2798 2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의

propercoding.tistory.com

여기는 삼중 for문 안이 또 약간 다르다.

카드 3개의 합이 m보다 작거나 같을 때 갱신하는데,

(카드 3개의 합 vs 원하는 합)을 Math.max()를 사용해 근사값을 구했다.

반응형