브루트 포스. 1단계
2798번. 블랙잭
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const [N, M] = input[0].split(" ").map((x) => Number(x));
const cardNum = input[1].split(" ").map((x) => Number(x));
// 3장의 합을 넣어놓을 빈 배열
let sumList = [];
// N장의 카드 중 3장만 사용할 수 있다
for(let i = 0; i < N; i++){
// 3장을 선택할 때 바뀌지 않고, 기준이 되어줄 카드를 pivot으로 설정
// 예를 들어, 5장이 있다고 하면
// 0,1,2 / 0,1,3 / 0,1,4 / 0,2,3 / 0,2,4 / 0,3,4 / 1,2,3 / ....
// 가장 앞에 둘 카드를 pivot으로 잡고 나머지 2장을 바꿔나가자
// pivot 설정
const pivot = cardNum[i];
for(let j = i + 1; j < N; j++){
// 2번째 카드 선택
const second = cardNum[j];
for(let k = j + 1; k < N; k++){
// 3번째 카드 선택
const third = cardNum[k];
// 선택한 3장의 카드의 합을 구함
const sum = pivot + second + third;
// 3장의 합은 M을 넘어서는 안됨
// sum이 M보다 같거나 작은 경우에만 sumList에 push
// 그렇지 않을 경우 continue로 다음 케이스 연산 진행
if(sum <= M){
sumList.push(sum);
} else {
continue;
}
}
}
}
// sumList 중에서 가장 큰 수가 M에 근접한 것
const answer = Math.max(...sumList);
console.log(answer);
pivot으로 설정한 카드가 N-2번 인덱스의 카드라면 3번째 카드는 주어진 카드의 숫자를 넘어간다.
이 부분을 예외 처리하지 않아도 되는 이유는...애초에 반복문 조건으로 인해서 선택 가능한 카드의 범위가 N-1번 인덱스까지기 때문이다.
3번째 카드가 N번째 인덱스를 가지게 된다면 반복문은 실행되지않고,
그 안에 있는 연산도 당연히 실행되지 않기 때문에 정답에 영향이 없다.