이 포스팅은 자바 8버전으로 풀이가 됐습니다.
문제
카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.
한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.
김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.
이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.
N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.
입력
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.
합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.
출력
첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 2798번
public class Main {
public static void main(String[]args) throws IOException {
try {
BufferedReader s_rd = new BufferedReader(new InputStreamReader (System.in));
String text[] = s_rd.readLine().split(" ");
// 카드 수, 블랙잭 (커트라인 값)
int N = Integer.parseInt(text[0]);
int M = Integer.parseInt(text[1]);
// 카드 수 초기화
int card[] = new int[N];
// 근사치 합 값
int sum=0, res=0;
// 입력
String num[] = s_rd.readLine().split(" ");
for(int i=0;i<N;i++) {
card[i] = Integer.parseInt(num[i]);
}
// 각 자리 수 연산
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(sum<=M && res<sum) {
res=sum;
}
}
}
}
System.out.println(res);
}
catch(IOException e) {
System.out.println("Error");
}
}
}
|
풀이
이미 간단한 설명은 문제를 풀면서 주석으로 처리했다.
조건 1) 카드의 수, 블랙잭 (초과하면 안되는 값)을 입력한다.
step 1) BufferedReader와 split를 활용하여 변수에 각각 끊어서 정수형으로 저장한다.
조건 2) 카드 값을 입력하라.
step 2) 카드 수(N) 만큼 선언된 15라인의 card 배열에 값을 대입한다.
조건 3) 입력받은 카드에서 M(최댓값)을 넘지 않게 연산한다. 또한 블랙잭(M)에 가까운 수를 출력한다.
step 3) 비효율인 n^3의 반복문을 실행하는 이유는 각각 다른 3개의 값을 더한 계산을 진행해야 하기 때문이다.
res 값을 추가로 갖는 이유는 블랙잭(M 최고점)에 가까운 값이 들어가야 하므로 근접한 값을 찾는 조건으로 준 것이다.
잡담)
처음에 문제를 잘못 읽어서 값이 랜덤한 값으로 받는 것으로 착각해서 Math.random으로 문제 풀다가 지문 다시 읽어보고 다시 접근했네요 😂 돌아가서 푸느라 시간이 더 오래 걸렸습니다. 그리고 '틀렸습니다'도 엄청 본 것 같네요😢
매일 새로운 유형을 단계별로 적립하고 있다는 것이 너무 행복한 것 같네요 😊
감사합니다.
다음 포스팅 때 뵙겠습니다.
'백준 - Java' 카테고리의 다른 글
[ 백준 - 2675 ][Java] OX퀴즈 (0) | 2022.05.10 |
---|---|
[ 백준 - 2675 ][Java] 문자열 반복 (0) | 2022.05.09 |
[ 백준 - 2439 ] [Java] 별 찍기 - 2 (0) | 2022.05.08 |
[ 백준 - 1978] [Java] 소수 찾기 (0) | 2022.05.06 |
[ 백준 - 1929] [Java] 소수 구하기 (0) | 2022.05.05 |