[백준] 2798

당당·2023년 4월 25일
0

백준

목록 보기
54/179

https://www.acmicpc.net/problem/2798

📔문제

이제 플레이어는 제한된 시간 안에 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

5 21
5 6 7 8 9

📺예제 출력 1

21

📝예제 입력 2

10 500
93 181 245 214 315 36 185 138 216 295

📺예제 출력 2

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보다 작다고 생각해서 틀렸었다!

먼저, 작은 순서대로 정렬해준다음 첫번째 카드를 고정해두고, 두번째, 세번째 카드를 변경해주면서 그 첫번째 카드 기준일때의 maxmaxs배열에 저장하는 식으로 해서, maxs배열을 내림차순으로 정렬하고 제일 앞에 있는 값을 출력했다.

https://defacto-standard.tistory.com/18

Integer[] maxArr=Arrays.stream(maxs).boxed().toArray(Integer[]::new);
Arrays.sort(maxArr,Comparator.reverseOrder());

배열을 내림차순으로 정렬하기 위해선 위와 같은 것을 사용했다.
자주 사용하게 될 것 같은데 기억해둬야겠다.

Integer 데이터 타입의 배열에 이전 배열을 저장하고 그걸 정렬한다.

profile
MySQL DBA 신입 지원

0개의 댓글