https://www.acmicpc.net/problem/2798
2798번: 블랙잭
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장
www.acmicpc.net
백준 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) (1) | 2022.07.08 |
---|---|
[백준]1181번 단어정렬(java) (0) | 2022.07.06 |
[백준]2108번 통계학(java) (2) | 2022.07.04 |
[백준]2581번 소수(java) (0) | 2022.07.04 |
[백준]2838번 설탕 배달(java) (2) | 2022.07.04 |
https://www.acmicpc.net/problem/2798
2798번: 블랙잭
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장
www.acmicpc.net
백준 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) (1) | 2022.07.08 |
---|---|
[백준]1181번 단어정렬(java) (0) | 2022.07.06 |
[백준]2108번 통계학(java) (2) | 2022.07.04 |
[백준]2581번 소수(java) (0) | 2022.07.04 |
[백준]2838번 설탕 배달(java) (2) | 2022.07.04 |