컴공댕이 공부일지
[ java ] 백준 (2798 블랙잭) 본문
728x90
백준 2798번 블랙잭
(브론즈 2)
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.util.Scanner;
public class Main {
public static void QuikSort(int a[], int left, int right) {
int pl=left;
int pr=right;
int x=a[(pl+pr)/2];
do {
while(a[pl]<x) pl++;
while(a[pr]>x) pr--;
if(pl<=pr) {
//스왑
int temp=a[pl];
a[pl]=a[pr];
a[pr]=temp;
//스왑하고 마저 진행
pl++;
pr--;
}
}while(pl<=pr);
if(left<pr) QuikSort(a, left, pr);
if(right>pl) QuikSort(a, pl, right);
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n=s.nextInt();
int m=s.nextInt();
int [] a = new int [n];
for(int i=0; i<n; i++) {
a[i]=s.nextInt();
}
int [] sum=new int[n*(n-1)*(n-2)]; //가능한 모든 합 담을 배열
int index=0; //sum배열 인덱스 값
//중복하지 않는 서로 다른 인덱스로 세 카드를 뽑는다!
for(int i=0; i<n; i++) {
for(int j=0; j<n ; j++) {
if(j==i) {
continue;
}
for(int k=0; k<n ; k++) {
if(j==k || i==k) {
continue;
}
sum[index]=a[i]+a[j]+a[k];
index++;
}
}
}
QuikSort(sum, 0, sum.length-1);
int res=0;
for(int i=0; i<index; i++) {
if(m<sum[i]) {
break;
}
res=sum[i];
}
System.out.println(res);
}
}
📖 풀이 요약
간단히 가능한 모든 경우의 수를 다 체크해서 정답을 찾는 방법인 완전 탐색 문제이다 :)
m이랑 같기 전까진 모든 경우의 수를 탐색해보는 문제이다.
그래서 for 반복문으로 겹치지않는 세 가지 인덱스 ijk를 선택하고,
해당 인덱스의 세 카드를 뽑아 합을 만드는 모든 경우를 다 고려해 sum 배열에 넣었다.
그리고 퀵 정렬 메소드를 활용해 오름차순으로 배열을 정렬하고,
m보다 커지면 반복문을 나오도록 설정해 m과 가장 근사한 합의 값을 얻도록 했다.
728x90
'PS > 코딩 문제 풀이 모음' 카테고리의 다른 글
[ C++/cpp ] 백준 (15685 드래곤 커브) ⭐구현, 시뮬레이션 (56) | 2023.11.24 |
---|---|
[ java ] 코드업 (1476 2차원 배열 빗금 채우기 3-1) (0) | 2023.06.10 |
[ java ] 백준 (7568 덩치) (3) | 2023.05.22 |
[ java ] 백준 ( 2231 분해합 ) (0) | 2023.05.11 |
[ java ] 프로그래머스 ( 42748 K번째 수 ) ⭐배열의 복사 / 정렬 [copyArray, copyOf, copyOfRange 총 정리] (0) | 2023.05.09 |
Comments