商品の検索

データセット選択メニュー【数値の出現率・英小文字の出現率・文字列の出現率・価格の算出・商品の検索】

【STEP: 1】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const A = lines[1].split(' ').map(Number);
   const count = new Array(10).fill(0);  // 初期値 0, 要素数 10 の配列
   for (let i = 0; i < N; i++) {
      count[A[i]]++;  // A[i]の値を 添字として count[A[i]] の値を加算 
   }
   console.log(count.join(' '));
});
hogeちゃんの画像

配列 count の初期値は 0 が 10個。for文で count[A[i]] の値を 1 増やしています。

【STEP: 2】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const S = lines[1].split('');
   const a = 'a'.codePointAt(); // "a" の文字コード(97)
   const count = new Array(26).fill(0);  // "a" 〜 "z" は26字 なので 配列の要素数は 26
    for (let i = 0; i < N; i++) {
       count[S[i].codePointAt() - a]++;  // S[i] が "a" の場合 添字は 97 ー 97 = 0

   }
   console.log(count.join(' '));
});
hogeちゃんの画像

アルファベットは26字なので配列 count の要素数も 26。codePointAt() は Unicode コードポイント値を返します。S[i] が “a” の場合 count の添字は “a” のコード – “a” のコード(97 -97) で 0になります。

【STEP: 3】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const S = [];
   for (let i = 1; i <= N; i++) {
      S.push(lines[i]);
   }
   S.sort();  // S の要素を辞書順に並替え
   const M = new Map();  // マップ M を初期化
   for (let i = 0; i < N; i++) {
      switch (M.has(S[i])) {  // MS[i] は含まれる?
       case false:  // 含まれなければ…
          M.set(S[i], 1);  // M に {S[i](キー), 1(値)} の要素を追加
          break;
       case true:  // 含んでいれば…
          M.set(S[i], M.get(S[i]) + 1);  // キー S[i] を 値 を + 1 して上書き
          break;
      }
   }
   for (const [key, value] of M.entries()) {
      console.log(key, value);  // M の キーと値をセットで出力
   }
});
hogeちゃんの画像

入力値を 配列 S に保存し sort() で辞書順に並べ替え。マップ MS[i] が含まれているかどうかで条件分岐して 含まれていない場合は M に (key,1)を追加。含まれている場合は M.get(S[i]) の値を+1。マップの解説はこちらをご参照しました。

【STEP: 4】コード

reader.on('close', () => {
   const [N, M] = lines[0].split(' ').map(Number);
   const T = new Map();  // マップ T を初期化
   for (let i = 1; i <= N; i++) {
      const [a, b] = lines[i].split(' ');  // a = 商品名, b = 価格
      T.set(a, Number(b));  // T に {商品名, 価格} を保存
   }
   for (let i = N + 1; i < M + N + 1; i++) {
      if (T.has(lines[i])) {  // T (キー) に 入力値があれば…
         console.log(T.get(lines[i]));  // 該当するキーの値(価格)を出力
      } else {  // なければ…
         console.log(-1);  // -1 を出力 
      }
   }
});
hogeちゃんの画像

T.set(a, Number(b))で マップ T に (商品名, 価格) を追加。 T.get(lines[i]) で 該当する商品の価格を出力しています。

【FINAL】コード

reader.on('close', () => {
   const [N, Q] = lines[0].split(' ').map(Number);
   const S = [];
   for (let i = 1; i <= N; i++) {
      S.push(lines[i]);
   }
   for (let i = N + 1; i < Q + N + 1; i++) {
      if (S.includes(lines[i])) {  // Slines[i] が含まれば…
         console.log(S.indexOf(lines[i]) + 1);  // 最初に出現する S の添字 + 1 を出力
      } else {  // 含まれば…
         console.log(-1);  // −1 を出力
      }
   }
});
hogeちゃんの画像

N 個の文字列を配列 S に保存。 S.includes(lines[i])S に入力値が含まれているかどうかの真偽値を取得し true なら 入力値が 最初に出現する Index を表示しています。

コメント