[백준 | Javascript] 2798

박기영·2022년 7월 3일
0

백준

목록 보기
73/127
post-custom-banner

브루트 포스. 1단계
2798번. 블랙잭

문제

2798번 문제 링크

solution

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번째 인덱스를 가지게 된다면 반복문은 실행되지않고,
그 안에 있는 연산도 당연히 실행되지 않기 때문에 정답에 영향이 없다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글