브루트 포스(완전탐색)은 처음이라 약간 떨렸는데 그래도 처음은 쉬운 문제라 다행이다.
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = input[0].split(' ').map(x=>+x)[0];
let M = input[0].split(' ').map(x=>+x)[1];
let arr = input[1].split(' ').map(x=>+x);
let len = arr.length;
// 12:46
// max(21) >= sum
// 모두 숫자가 보이도록 바닥에 놓는다. 그 후 M선언(확인)
// N장 중 3장 pick, M > sum
let notOver = [];
let sum = 0;
for(let i =0; i < len; i++) {
for(let j=i+1; j < len; j++) {
for(let x=j+1; x < len; x++) {
sum = arr[i] + arr[j] + arr[x];
if(M >= sum) {
notOver.push(sum);
}
}
}
}
let max = notOver[0];
notOver.forEach(e => {
if(max < e) {
max = e;
}
});
console.log(max);
이건 진짜 무식하게 다 돌리기로 했다. 시간초과 뜰까 걱정했는데 다행히 잘 작동했다.
간단하게 설명하자면
1. 각 배열의 3가지 조합의 합들을 모두 구한다.
2. 그리고 그 중 M을 넘기지 않는 숫자들을 notOver배열에 넣어준다.
3. for문이 끝나고 notOver중 가장 큰 수를 찾아 정답으로 출력한다.
i,j,x의 시작숫자의 이유는 i는 처음부터 다 돌아야 하고, j는 i보다 1큰 숫자부터 시작하니까, x는 j보다 1큰 숫자부터 시작이니 저렇게 정했다.