세 장의 카드를 고르는 모든 경우를 고려하는 문제
시간:1초
메모리:128MB
카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 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장의 합을 출력한다.
모든 경우의 수를 뽑는다고 생각하여 모든 3카드의 합을 더해 max값하고 가장 근접할 값을
들고 빠져 나오는 코딩을 생각했다
이문제에서 고려할 알고리즘은 브루트포스 알고리즘 이라는 녀석이다
브루트포스 알고리즘 이란?
brute: 무식한, force: 힘 무식한 힘으로 해석할 수 있다.
완전탐색 알고리즘. 즉, 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다.
이 알고리즘의 강력한 점은 예외 없이 100%의 확률로 정답만을 출력한다.
즉. 모든 경우의 수를 탐색하면서 필요한 값만 가져온다는 개념이다
문제를 해결하는 방식은
import java.util.Scanner;
public class day1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt(); //처음 뽑는 카드 갯수를 입력받는 변수
int m =scanner.nextInt();//최대 max값을 정해 입력받는 변수
int [] list = new int[n]; // 뽑을 카드 수를 저장할 배열
for (int i = 0; i <n; i++) {
list[i] = scanner.nextInt();
}
int sum = 0;
for (int i = 0; i < n-2; i++) { // 1번째 카드를 뽑는 횟수 3개를 뽑기 때문에 n-2를함
for (int j = i+1; j < n-1; j++) { //2번쨰 카드를 뽑는 횟수
for (int k = i+1; k < n; k++) {//3번째 카드를 뽑는 횟수
int temp = list[i]+list[j]+list[k];
if (sum < temp && temp <= m) sum = temp; // 뽑은 카드들의 합이 지난 카드의 합보다
//크거나 지금 합이 max값보다 작거나 같다면 현제 값을 sum변수에 저장
}
}
}
System.out.println(sum);
}
}
메모리 22884KB
시간 312ms