문제
카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 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장의 합을 출력한다.
| 예제입력 | 예제출력 |
| 5 21 5 6 7 8 9 |
21 |
| 10 500 92 181 245 214 315 36 185 138 26 295 |
497 |
이번단계는 브루트포스 단계이다.
❗ brute 짐승같은,난폭한 force 힘 이라는 뜻으로 합치면 난폭한 힘,폭력 이라는 뜻인데
이는 원시적으로 푸는방법인 수 대입 노가다라고 볼 수있다.
오래걸리며 자원이 많이들어 무식하게 보일수는 있지만 모든경우의수를 검증하는것이므로
정확도100%를 보장한다는점에서 암호해독법중 가장 확실하고 무서운방법.
⭕ 풀이
const input=require('fs').readFileSync('/dev/stdin').toString().split('\n');
let t=input.shift().split(' ').map(x=>Number(x));
let num=input.shift().split(' ').map(x=>Number(x));
let arr=[0];
let sum=0;
for(let i=0; i<t[0]; i++){
for(let j=1; j<t[0]; j++){
for(let o=2; o<t[0]; o++){
if(i!=j && i!=o && j!=o){
sum=num[i]+num[j]+num[o];
if(sum<=t[1]&&arr[0]<sum){
arr[0]=sum;
}
}
}
}
}
console.log(arr[0]);
모든 경우의수를 다 검증해봐야하니 아직 재귀함수는 익숙치 않아서 그런가
바로 떠오른 다중 for문을 사용해서 풀이했다.
if를 조건을 좀 길게하더라도 하나만 사용할 수 있었으나
보기편하게하기위해 두개를 나누어썼고
i와 j와 o가 다 달라야한다는 조건은
동일한 인덱스를 세번 더하는경우가 생기면 답이 틀리게 나올수도있다고 생각했기때문이다.
처음에는 두번째 if문을 만족한다면
❗ arr.push(sum) 을사용해
console.log(Math.max(...arr))로 출력하려했으나
스택사이즈초과 에러가 나서 arr[0]값을 갱신하는 방향으로 해결했다.
-출처
'Algorithm > Baekjoon(Node.js)' 카테고리의 다른 글
| [JavaSrcipt] Baekjoon - 7568 : 덩치 (0) | 2021.10.15 |
|---|---|
| [JavaSrcipt] Baekjoon - 2231 : 분해합 (0) | 2021.10.14 |
| [JavaSrcipt] Baekjoon - 11729 : 하노이 탑 이동 순서 (0) | 2021.10.12 |
| [JavaSrcipt] Baekjoon - 2747 : 피보나치 수 (0) | 2021.10.11 |
| [JavaSrcipt] Baekjoon - 2447 : 별 찍기 - 10 (0) | 2021.10.10 |