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

paizaの森練習問題コンテスト(2022/4/28開催)の過去問

【文字列の逆順】コード

reader.on('close', () => {
   const s = lines[0].split('');  // 入力値を1字毎の配列に変換
   console.log(s.reverse().join(''));  // s を逆順に並べ替えて 連結して出力
});
hogeちゃんの画像

文字列のまま逆順に並べる方法は見つからなかったので split('')で一文字ずつの配列に変換し reverse()で逆順に並べ換え join('')で連結して出力ました。

【英単語の生成(連結)】コード

reader.on('close', () => {
   const [s1, s2] = lines[0].split(' ');  // 半角スペース区切りの配列を生成
   console.log([s1, s2].join(''));  // 連結して出力
   // console.log(s1 + s2);
});
hogeちゃんの画像

split(' ')で半角スペース区切りの配列を生成し join('')で連結。

【小文字にする】コード

reader.on('close', () => {
   const s = lines[0];
   console.log(s.toLowerCase());  // すべて小文字に変換して出力
});
hogeちゃんの画像

toLowerCase()で 大文字は全て小文字になりました。

【キーボードのシミュレーション】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   let C = '';  // 表示される文字列(最初は空文字)
   let lock = false;  // capslockキーが offならfalse, onならtrue
   for (let i = 1; i <= N; i++) {
      const c = lines[i].split(' ');
      switch (c[0]) {  // c[0] が…
      case 'capslock':  // "capslock" なら…
         lock ? lock = false : lock = true;  // lock の true と false を反転
         break;
      case 'shift':  // "shift" なら…
         C += c[1].toUpperCase();  // c[1] を大文字にして C に連結
         break;
      default:  // その他 なら…
         lock ? C += c[0].toUpperCase() : C += c[0];
   // lock が true なら c[0] を大文字にして C に連結 false なら そのまま連結
         break;
      }
   }
   console.log(C);
});
hogeちゃんの画像
問題分の通り switch文 で条件分岐。″capslock″ のときの処理は up がtrue のときは false・false のときは true になるよう 三項演算子で制御しています。

【ラッキーナンバー】コード

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 = [];  // 777 になる組み合わせ
   let count = 0;  // 777 になる組み合わせの数
   for (let i = 0; i < N; i++) {
      if (count === 1) {  // count が 2 であれば…
         break;  // 何もしない
      }
      let sum= A[i];
      if (sum === 777) { // sum が 777 になったら…
         count++;  // count を加算 
         ans[0] = A[i];
         break;
      } else if (sum > 777) {
         break;
      }
      for (let j = i + 1; j < N; j++) {
         sum = A[i] + A[j];
         if (sum === 777) {
            [ans[0], ans[1]] = [A[i], A[j]];
            count++;
            break;
         } else if (sum > 777) {
            break;
         }
         for (let k = j + 1; k < N; k++) {
            sum = A[i] + A[j] + A[k];
            if (sum === 777) {
               [ans[0], ans[1], ans[2]] = [A[i], A[j], A[k]];
               count++;
               break;
            } else if (sum > 777) {
               break;
            }
            for (let l = k + 1; l < N; l++) {
               sum = A[i] + A[j] + A[k] + A[l];
               if (sum === 777) {
                  [ans[0], ans[1], ans[2], ans[3]] = [A[i], A[j], A[k], A[l]];
                  count++;
                  break;
               } else if (sum > 777) {
                  break;
               }
               for (let m = l + 1; m < N; m++) {
                  sum = A[i] + A[j] + A[k] + A[l] + A[m];
                  if (sum === 777) {
                     [ans[0], ans[1], ans[2], ans[3], ans[4]] = [A[i], A[j], A[k], A[l], A[m]];
                     count++;
                     break;
                  } else if (sum > 777) {
                     break;
                  }
                  for (let n = m + 1; n < N; n++) {
                     sum = A[i] + A[j] + A[k] + A[l] + A[m] + A[n];
                     if (sum === 777) {
                        [ans[0], ans[1], ans[2], ans[3], ans[4], ans[5]] = [A[i], A[j], A[k], A[l], A[m], A[n]];
                        count++;
                        break;
                     } else if (sum > 777) {
                        break;
                     }
                     for (let o = n + 1; o < N; o++) {
                        sum = A[i] + A[j] + A[k] + A[l] + A[m] + A[n] + A[o];
                        if (sum === 777) {
                           [ans[0], ans[1], ans[2], ans[3], ans[4], ans[5], ans[6]] = [A[i], A[j], A[k], A[l], A[m], A[n], A[o]];
                           count++;
                           break;
                        } else if (sum > 777) {
                           break;
                        }
                        for (let p = o + 1; p < N; p++) {
                           sum = A[i] + A[j] + A[k] + A[l] + A[m] + A[n] + A[o] + A[p];
                           if (sum === 777) {
                              [ans[0], ans[1], ans[2], ans[3], ans[4], ans[5], ans[6], ans[7]] = [A[i], A[j], A[k], A[l], A[m], A[n], A[o], A[p]];
                              count++;
                              break;
                           } else if (sum > 777) {
                              break;
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }
   switch (count) {
   case 0:
      console.log('no answer');
      break;
   case 1:
      console.log(ans.join(' '));
      break;
   default:
      console.log('multiple answers');
      break;
   }
});
hogeちゃんの画像

入力で与えられる自然数は 8 個 以下なので 全てのパターンで 足して777になるかどうか 多重ループで調べています。値を 事前に 小さい順に並べ sum が777以上になる場合と count が 2 になった場合は 処理を止めています。コードが長くなったので いずれ整理しようかと思っていますが…。
(´ω`)

コメント