Source: https://koi.or.kr/koi/2022/1/

Bronze

function solution(input) {
  const data = input.trim();
  const nums = data.split(/\\s+/).map(Number);
  let idx = 0;
  const N = nums[idx++]; // 묶음 수
  const K = nums[idx++]; // 묶음당 빵 개수
  const P = nums[idx++]; // 크림 없는 빵 허용 한도(미만)
  let sellable = 0;
  for (let i = 0; i < N; i++) {
    let noCream = 0;
    for (let j = 0; j < K; j++) {
      if (nums[idx++] === 0) noCream++;
    }
    if (noCream < P) sellable++;
  }
  return sellable;
}
function solution(input) {
  const [P, M, K] = input.split(' ').map(Number);
  if (K <= 10 && P * K <= M) {
    console.log("YES");
  } else {
    console.log("NO");
  }
}

Silver

function solution(input) {
    // 1. 모든 데이터를 숫자 배열로 평탄화(Flatten)
    const nums = input.trim().split(/\\s+/).map(Number);
    let idx = 0;

    // 2. 포인터(idx++)를 사용하여 데이터 추출
    const n = nums[idx++]; 
    const A = [];
    for (let i = 0; i < n; i++) {
        A.push(nums[idx++]);
    }

    // 3. 문제 로직 수행
    // S[0]: 짝수 누적 개수, S[1]: 홀수 누적 개수
    let S = [0, 0];
    // ans[0], ans[1]: 각 상태별 조건 만족 횟수
    let ans = [0, 0];

    for (let i = 0; i < n; i++) {
        // 현재 숫자의 홀짝 여부 (음수 대응을 위해 Math.abs 사용)
        let x = Math.abs(A[i]) % 2;

        S[x] += 1;
        // 상대방(1-x)의 누적 개수를 현재 답에 더함
        ans[x] += S[1 - x];
    }

    // 4. 결과값 중 최솟값 반환
    return Math.min(...ans);
}

Platinum

function solution(input) {
  const data = input.trim().split(/\\s+/).map(Number);

  let idx = 0;
  const N = data[idx++];

  // A = [0] + list(map(int, input().split()))
  const A = [0];
  for (let i = 0; i < N; i++) {
    A.push(data[idx++]);
  }

  // D = [0 for _ in range(N+1)]
  const D = Array(N + 1).fill(0);

  for (let i = 1; i <= N; i++) {
    let r = D[i - 1];
    let x = A[i];

    for (let j = i - 1; j >= 1; j--) {
      x = A[j] - x;
      if (x < 0) break;
      if (x === 0 && r <= D[j - 1]) {
        r = D[j - 1] + 1;
      }
    }

    D[i] = r;
  }

  return String(N - D[N]);
}

function solution(input) {
  const data = input.trim().split(/\\s+/).map(Number);
  let idx = 0;

  const n = data[idx++];
  let l = data[idx++];
  let r = data[idx++];

  const a = new Array(n);
  for (let i = 0; i < n; i++) a[i] = data[idx++];

  for (let i = 0; i < n; i++) a[i] -= l;
  for (let i = 1; i < n; i++) a[i] += a[i - 1];
  r -= l;

  if (a[n - 1] < 0 || a[n - 1] > r * n) {
    return '-1';
  }

  const INF = 1e15;
  const maxSum = r * n;
  const dp = Array.from({ length: n }, () => Array(maxSum + 1).fill(INF));

  for (let v = 0; v <= r; v++) {
    dp[0][v] = Math.abs(a[0] - v);

    for (let i = 1; i < n; i++) {
      const upper = v * (i + 1);
      for (let j = v; j <= upper; j++) {
        const ndp = dp[i - 1][j - v] + Math.abs(a[i] - j);
        if (ndp < dp[i][j]) dp[i][j] = ndp;
      }
    }
  }

  return String(dp[n - 1][a[n - 1]]);
}