<문제>
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문의 구조를 쉽게 생각하지 못하는 것 같다.
어떤 방식으로 풀어야될지 몰라서 , 다른 블로그를 참고하여 해결하였다.
알고리즘 공부의 필요성을 정말 느낀다. 🥹
이건 뭐 알고리즘을 사용한 문제도 아닌데, 풀지 못해서 속상하다.
이런 문제도 익숙해지도록 더 열심히 해야지.
'코딩테스트 > Baekjoon' 카테고리의 다른 글
[JAVA] 백준 2002번: 추월 (0) | 2024.03.25 |
---|---|
[JAVA] 백준 1713번: 후보 추천하기 (0) | 2024.03.22 |
[JAVA] 백준 18429번: 근손실 (1) | 2024.03.11 |
[JAVA] 백준 1966번: 프린터 큐 (1) | 2024.03.08 |
[JAVA] 백준 1212번: 8진수 2진수 (0) | 2024.01.11 |