https://www.acmicpc.net/problem/2798
백준 2798번 블랙잭 문제 링크입니다.
핵심
여러 수를 받고, 그중에 3장을 골라 합이 우리가 원하는 값인 M에 근접한 값을 찾는 것이다. 이 문제는 브루트 포스로 분류되어 있는데, 이는 무차별 대입이란 뜻이다. 문제의 분류에 맞게 무차별 대입의 방법을 사용하자.
정답 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] arr = new int[N];
for(int i=0; i <N;i++) {
arr[i]=sc.nextInt();
}
int min=100000; //값의 차이
for(int i =0; i<=N-3;i++) {
for(int j=i+1; j<=N-2;j++) {
for(int k=j+1; k<=N-1; k++) {
if(arr[i]+arr[j]+arr[k]<=M) {
if(M-(arr[i]+arr[j]+arr[k])<=min)
min=M-(arr[i]+arr[j]+arr[k]);
}
}
}
}
System.out.println(M-min);
}
}
해설
무차별 대입을 하였는데, 반복문의 의미는 만약 0 1 2 3 4가 있다면,
{0,1,2},{0,1,3},{0,1,4},{1,2,3},{1,2,4},{2,3,4}를 찾게 되는 반복문이다.
3개의 값이 원하는 값인M보다 작으면, 그 값과 M의 차이를 min에 대입한다.
그래서 가장 차이가 적은 값을 구하게 된다.
이후 M과 그 차이를 출력하면, 3장의 카드 합이 나온다.
개선점이나 오류가 있다면, 댓글 부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준]18870번 좌표 압축(java) (0) | 2022.07.08 |
---|---|
[백준]1181번 단어정렬(java) (0) | 2022.07.06 |
[백준]2108번 통계학(java) (1) | 2022.07.04 |
[백준]2581번 소수(java) (0) | 2022.07.04 |
[백준]2838번 설탕 배달(java) (2) | 2022.07.04 |