본문 바로가기

코딩테스트/Baekjoon

[JAVA] 백준 2798번: 블랙잭

<문제>

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

 

2798번: 블랙잭

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

www.acmicpc.net

<풀이>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class P2798 {
	//블랙잭
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		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());
		int card[]=new int[n];
		int sum=0;
		int tmp=0;
		
		st=new StringTokenizer(br.readLine());
		for(int i=0;i<n;i++) {
			card[i]=Integer.parseInt(st.nextToken());
		}
		
		for(int i=0;i<n;i++) {
			for(int j=i+1;j<n;j++) {
				for(int k=j+1;k<n;k++) {
					sum=card[i]+card[j]+card[k];
					
					if(tmp<sum && sum<=m)
						tmp=sum;
				}
			}
		}
		System.out.println(tmp);
	}

}

 

✏️ 풀이 방법

 

3중 for 문을 통해 모든 경우의 수를 계산한다.

ex ) int card[5] = { 5, 6 ,7 ,8, 9} 일 때 , 

(5,6,7) , (5,6,8), (5,6,9) ..이런식으로 모든 경우의 수를 구하여

입력 받은 m 값과 가장 가까운 sum 값을 찾는다. 

tmp 는 이전에 저장된 m과 가장 가까운 수라고 생각하면 된다.

만약, tmp가 sum보다 작고, sum이 m보다 작거나 같으면 tmp 값을 변경한다.

 

=> 현재 값(sum)이 이전 값(tmp) 보다 큰데 , 현재 값(sum) 이 m보다 작거나 같다, 

즉 m과 더 가까운 수라는 뜻이므로 !! 

 

✍🏻 느낀점

 

나는 예전부터 느꼈지만, 3중 for문의 구조를 쉽게 생각하지 못하는 것 같다.

어떤 방식으로 풀어야될지 몰라서 , 다른 블로그를 참고하여 해결하였다.

알고리즘 공부의 필요성을 정말 느낀다. 🥹

이건 뭐 알고리즘을 사용한 문제도 아닌데, 풀지 못해서 속상하다.

이런 문제도 익숙해지도록 더 열심히 해야지.