이제 플레이어는 제한된 시간 안에 N
장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M
을 넘지 않으면서 M
과 최대한 가깝게 만들어야 한다.
N
장의 카드에 써져 있는 숫자가 주어졌을 때, M
을 넘지 않으면서 M
에 최대한 가까운 카드 3장의 합을 구해 출력하시오.
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)
과 M(10 ≤ M ≤ 300,000)
이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.
합이 M
을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.
첫째 줄에 M
을 넘지 않으면서 M
에 최대한 가까운 카드 3장의 합을 출력한다.
5 21
5 6 7 8 9
21
10 500
93 181 245 214 315 36 185 138 216 295
497
Contest > Croatian Open Competition in Informatics > COCI 2011/2012 > Contest #6 1번
-문제를 번역한 사람: baekjoon
-빠진 조건을 찾은 사람: bupjae
-문제의 오타를 찾은 사람: eric00513, joonas, otter66
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Code2798 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int M=scanner.nextInt();
int max=0;
int sum=0;
int[] cards=new int[N];
int[] maxs=new int[N];
for(int i=0; i<N;i++) {
cards[i]=scanner.nextInt();
}
Arrays.sort(cards);
for(int i=0;i<N;i++) {
for(int j=i+1;j<N;j++) {
for(int k=j+1;k<N;k++) {
sum=cards[i]+cards[j]+cards[k];
if(sum<=M) {
if(max==0) {
max=sum;
}
else if(max<sum) {
max=sum;
}
}
}
}
maxs[i]=max;
}
Integer[] maxArr=Arrays.stream(maxs).boxed().toArray(Integer[]::new);
Arrays.sort(maxArr,Comparator.reverseOrder());
System.out.println(maxArr[0]);
}
}
처음에는 for문 j
, k
시작을 잘못줬다.
그리고 두번째는 M
을 넘지 않으면서를 그냥 M
보다 작다고 생각해서 틀렸었다!
먼저, 작은 순서대로 정렬해준다음 첫번째 카드를 고정해두고, 두번째, 세번째 카드를 변경해주면서 그 첫번째 카드 기준일때의 max
를 maxs
배열에 저장하는 식으로 해서, maxs
배열을 내림차순으로 정렬하고 제일 앞에 있는 값을 출력했다.
Integer[] maxArr=Arrays.stream(maxs).boxed().toArray(Integer[]::new);
Arrays.sort(maxArr,Comparator.reverseOrder());
배열을 내림차순으로 정렬하기 위해선 위와 같은 것을 사용했다.
자주 사용하게 될 것 같은데 기억해둬야겠다.
Integer
데이터 타입의 배열에 이전 배열을 저장하고 그걸 정렬한다.