paizaの森練習問題コンテスト過去問題7

paizaの森練習問題コンテスト(2022年12月開催)の過去問

【占い】コード

reader.on('close', () => {
   const n = Number(lines[0]);  // 入力を n で受取り
   console.log(n === 7 ? 'Yes' : 'No');  // n が true なら'Yes', false なら 'No' を出力
});
hogeちゃんの画像

入力を数値化して n で受け取り 三項演算子で出力値を振り分けました。

【年収計算】コード

reader.on('close', () => {
   const [a, b, c] = lines[0].split(' ').map(Number);
   if (c < 5) {  // 5年未満
      console.log(a);
   } else if (c < 10) {  // 5年以上10年未満
      console.log(a + b);
   } else if (c < 15) {  // 10年以上15年未満
      console.log(a + b * 2);
   } else if (c < 20) {  // 15年以上20年未満
      console.log(a + b * 3);
   } else {  // 20年以上10年未満
      console.log(a + b * 4);
   }
});
hogeちゃんの画像

5年毎に給料が up。if文 で条件分岐して出力しています。

【気温】コード

reader.on('close', () => {
   const X = Number(lines[0]);
   if (X >= 35) {  // 35度以上
      console.log('extremely hot day');
   } else if (X >= 30) {  // 30度以上35度未満
      console.log('hot summer day');
   } else if (X >= 25) {  // 25度以上30度未満
      console.log('summer day');
   } else if (X < 0) {  // 0度未満
      console.log('ice day');
   } else {  // その他
      console.log('normal day');
   }
});
hogeちゃんの画像

余談ですが 温暖化で 猛暑日が増えましたね。そのうち 40度以上 の カテゴリーができるかも??

【気温2】コード

reader.on('close', () => {   
   const X = lines[1].split(' ').map(Number);
   const [H, L] = [Math.max(...X), Math.min(...X)];  // 最高値(H)と最低値(L)を抽出
   console.log(H - L);
});
hogeちゃんの画像
Math.max()で最高値・Math.min() で最低値を抽出することができました。

【5】コード

reader.on('close', () => {
   const [n, m] = lines[0].split(' ').map(Number);
   let block_num = 0;  // 敷き詰めるブロックの数
   if (n % 2 === 0) {  // n が 2 で割り切れる場合
      block_num = n / 2 * m;
   } else {  // n が 2 で割り切れない場合
      block_num = parseInt(n / 2) * m + parseInt(m / 2);
   }
   console.log(block_num);
});
hogeちゃんの画像

縦長に敷き詰めてから 隙間があれば横長に敷き詰める感じで。

【最も大きな最大公約数】コード

reader.on('close', () => {
   const n = Number(lines[0]);
   let ans = 1;
   for (let i = 1; i < n; i++) {
      for (let j = i + 1; j <= n; j++) {
         const GCD = gcd(j, i);
  // 関数 gcd() を呼び出して戻り値を GCD に代入
         if (GCD > ans) {  // GCDans より大きければ ans の値を上書き
            ans = GCD;
         }
      }
   }
  // ここから 最大公約数を求める関数 (ユークリッドの互除法)
   function gcd(a, b) {
      while (a && b) {
         a %= b;  // ab を割り a をその余りで置き換え
         [a, b] = [b, a];  // a, b の値を置換
      }
       return a;
    }
    console.log(ans);
});
hogeちゃんの画像

ユークリッドの互除法はこちら

【三冠王】

reader.on('close', () => {
   const n = Number(lines[0]);
   const A = new Array(n);  // 打率
   const R = new Array(n);  // 打点
   const H = new Array(n);  // 本塁打
   let Triple = false;  // 三冠王ならtrueで上書き
   let Double = false;  // 二冠王ならtrueで上書き
   for (let i = 1; i <= n; i++) { 
  // 入力値を ave, rbi, h_run で受け取り A, R, H に保存
      const [ave, rbi, h_run] = lines[i].split(' ').map(Number);
      [A[i - 1], R[i - 1], H[i - 1]] = [ave, rbi, h_run];
   }
  // 配列 A, R, H の最大値を取得して A_max, R_max, H_max に代入
   const [A_max, R_max, H_max] = [Math.max(...A), Math.max(...R), Math.max(...H)];
   for (let i = 0; i < n; i++) {
      if (A[i] === A_max && R[i] === R_max && H[i] === H_max) {
         Triple = true;  // 3 つの値が各最大値と一致すれば三冠王
         break;
      } else if (A[i] === A_max && R[i] === R_max || 
                 A[i] === A_max && H[i] === H_max || 
                 R[i] === R_max && H[i] === H_max) {
         Double = true;  // 2 つの値が各最大値と一致すればニ冠王
      }
   }
   if (Triple) {  // Triple が true なら
      console.log('Triple');
   } else if (Double) {  // Double が true なら
      console.log('Double');
   } else {  // 該当しなければ
      console.log('Nobody');
   }
});
hogeちゃんの画像

問題文の通り 条件分岐しました。

コメント