配列に対しての複雑な処理

配列活用メニュー【傾斜配点・内定・queue(9)係・二人三脚・場所取り・ボウリング・集団行動】

【STEP: 1】コード

reader.on('close', () => {
  const N = Number(lines[0]);
  const M = lines[1].split(' ').map(Number);
  const total = [];  // 各受験者の合計得点を保存
  for (let i = 2; i < N + 2; i++) {
    const A = lines[i].split(' ').map(Number);  // 各科目の得点
      for (let j = 0; j < 5; j++) {
        A[j] *= M[j];  // 点数を点数✕科目の重みで上書き…①
      }
    total.push(A.reduce((a, c) => a + c));  // totaleA の値の合計を保存…②
  }
  console.log(Math.max(...total));  // totalの最大値を出力…③
});
hogeちゃんの画像

①配列 A の各要素に対し index が一致する 配列 M の要素を乗算した値で上書き。②配列 totaleA の値を足し合わせた値を保存。③配列 total をスプレッド構文(…total)で展開してMath.max() で最大値を抽出。

【STEP: 2】コード

reader.on('close', () => {
  const [N, K, M] = lines[0].split(' ').map(Number);
  const A = [];
  let ans = 0;  // 内定者の人数(0で初期化)…①
  for (let i = 1; i <= N; i++) {
    A.push(Number(lines[i]));
  }
  for (let i = 0; i < N; i++) {
    if (A[i] >= K) {  // Aの値がK以上なら内定(ans++)…②
      ans++;
    }
  }
  ans -= M;  // →③
  console.log(ans >= 0 ? ans : 0);
});
hogeちゃんの画像

①内定者の人数を保存する変数 ans を宣言。②A の値が K 以上なら ans++。③ans から M を減算。

【STEP: 3】コード

reader.on('close', () => {
  const N = Number(lines[0]);
  const A = [];
  for (let i = 1; i <= N; i++) {
    const S = lines[i].split(' ');
    switch (S[0]) {
    case 'out':
      A.shift();
      break;
      case 'in':
       A.push(S[1]);
       break;
      }
   }
  A.forEach(a => {
    console.log(a);
   });
});
hogeちゃんの画像

switch文 で条件分岐。S[0]が ″out″ の時は shift() で先頭の要素を削除。 ″In″ の時は push(S[1]S[1] を追加。

【STEP: 4】コード

reader.on('close', () => {
  const N = Number(lines[0]);
  const A = [];
  for (let i = 1; i <= N; i++) {
    A.push(Number(lines[i]));
  }
  A.sort((s, b) => s - b);
  const ans = [A[0], A[1]];
  for (let i = 2; i < N; i++) {
    if (A[i] - A[i - 1] < ans[1] - ans[0]) {
      [ans[0], ans[1]] = [A[i - 1], A[i]];
    }
  }
  console.log(ans[0] + '\n' + ans[1]);
});
hogeちゃんの画像
A を小さい順に並べ替えて ans の値の初期値を A[0], A[1] に設定。もし A[i] - A[i - 1]ans[1] - ans[0]より小さければ ans の各値を上書き。

【STEP: 5】コード

reader.on('close', () => {
  const [N, K, F] = lines[0].split(' ').map(Number);
  const A = [];
  for (let i = 1; i <= K; i++) {
    A.push(Number(lines[i]));
  }
  A.splice(0, F);
  const S = new Set(A);
  S.forEach(s => {
    console.log(s);
  });
});
hogeちゃんの画像

先ず配列 AK 個 のデータを保存。K 個 のデータから splice(0, F)F 個 のデータを切り取り Set(A)で重複を削除

【STEP: 6】コード

reader.on('close', () => {
  let P = [];
  for (let i = 3; i >= 0; i--) {
    P.push(lines[i].split(' ').map(Number).reverse());
  }
  P = P.flat();
  for (let i = 0; i < 10; i++) {
    if (P[i]) {
      console.log(i + 1);  // 狙うピン
      break;
    }
  }
  console.log(P.reduce((a, c) => a + c));  // 残数
});
hogeちゃんの画像

ピンの番号-1 を配列の index に置き換え 昇順に並べたいので for文 で lines[3]lines[0] の順にデータを取得し 更に各行のデータを逆順に並べ替えた配列を P に保存。P.flat()で 多次元配列をフラット化。

【FINAL】コード

reader.on('close', () => {
  const [N, Q] = lines[0].split(' ').map(Number);
  let S = [];
  for (let i = 1; i <= N; i++) {
    S.push(i);
  }
  for (let i = 1; i <= Q; i++) {
    const s = lines[i].split(' ');
    switch (s[0]) {
    case 'swap':
      [S[s[1] - 1], S[s[2] - 1]] = [S[s[2] - 1], S[s[1] - 1]];
      break;
    case 'reverse':
      S.reverse();
      break;
    case 'resize':
      S = S.slice(0, s[1]);
      break;
    }
  }
  S.forEach(s => {
    console.log(s);
  });
});
hogeちゃんの画像

for文 で Q 行の指示を 配列 s として順次取得し 問題の指示通り s[0] の値で条件分岐。配列 S の値を上書きし 出力。

コメント