Vtuber

クエリメニュー【アイドルグループ・歴史を作る時間・銀行・経理・Vtuber】

【STEP: 1】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const A = new Set();  // セット A を宣言
   for (let i = 1; i <= N; i++) {
      A.add(lines[i]);  // A にアイドル名を保存
   }
   for (let i = N + 1; i <= N + K; i++) {
      const S = lines[i].split(' '); 
      switch (S[0]) {  // S[0]が…
         case 'join':  // "join" なら…
            A.add(S[1]);  // AS[1] を追加
            break;
         case 'leave':  // "leave" なら…
            A.delete(S[1]);  // A から S[1] を削除
            break;
         case 'handshake':  // "handshake" なら…
            const Name = Array.from(A).sort();  // A を配列 Name に変換し 50音順に並べ替え
            Name.forEach(name => {
               console.log(name);  // Name の値を出力
            });
            break;
      }
   }
});
hogeちゃんの画像

セットに メンバーの名前を保存し イベント毎に処理を振り分け追加・削除・並べ替えと表示を実行。ただし セットは値の並べ替えができないので 並べ替える前に配列の値として展開しました。

【STEP: 2】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const A = [];
   for (let i = N + 1; i <= N + K; i++) {
      const [Y, C] = lines[i].split(' ');
      A.push([C, Number(Y)]);  // A に[C = 名前, Y = 年]を保存
   }
   A.sort();  // AA[i][0](名前) を基準に 50音順に並替え
   A.sort((s, b) => s[1] - b[1]);  // 更に A[i][1](年) を基準に 昇順に並替え
   A.forEach(a => {
      console.log(a[0]);  // 名前 を出力
   });
});
hogeちゃんの画像

問題の指示通りの順序で出力するために A[i][0] の値を基準に 50音順で並べ替えてから 更にA[i][1]を基準に小さい順に並べ替えて forEach()で出力しました。

【STEP: 3】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const Company = new Map();  // マップ Company を宣言
   for(let i = 1; i <= N; i++) {
      const [C, P, D] = lines[i].split(' ');  // [C, P, D] = [会社名, 番号, 残高]
      Company.set(C, [P, D]);  // Company に {C (キー), [P, D](値)} を保存
   }
   for (let i = N + 1; i <= N + K; i++) {
      const [G, M, W] = lines[i].split(' ');  // [G, M, W] = [会社名, 番号, 金額]
      if (Company.get(G)[0] === M) {  // 会社名 と 番号 が一致すれば…
         Company.get(G)[1] -= W;  // W 円 引き出し
      }
   }
   Company.forEach((value, key) => {
      console.log(key, value[1]);  // key(会社名) と 値[1](金額)を出力
   });
});
hogeちゃんの画像

マップに取引前の情報(key=会社名 値=[暗証番号, 残高])を保存。会社名と暗証番号が一致すれば 残高 − WforEach()で key(会社名) と 値[1](金額)を表示。

【STEP: 4】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const Manage = new Map();
   for (let i = 1; i <= N; i++) {
      const S = lines[i];  // 部署名
      Manage.set(S, []);  // Manage に {S, []} を保存
   }
   for (let i = N + 1; i <= N + K; i++) {
      const [A, P, M] = lines[i].split(' ');  // [A, P, M] = [部署名, 番号, 金額]
      Manage.get(A).push([P, M]);  // Manage.A の値(配列)に [P, M]を保存
   }
   Manage.forEach((value, key) => {
      console.log(key);  // key を出力
      value.forEach(value => {  // value は 2次元配列
         console.log(value.join(' '));  // value の値を 結合して出力
      });
      console.log('-----');
   });
});
hogeちゃんの画像
こちらも データを マップに保存。マップは文字列をkeyにできるので便利です。

【FINAL】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const S = new Map();  // マップ S を宣言(スーパーチャット{名前, 金額})
   const M = [];  // 配列 M を宣言(メンバーシップ加入者)
   for (let i = 1; i <= N; i++) {
      const E = lines[i].split(' ');
      switch (E[1]) {
         case 'give':  // E[1] が "give" なら…
         if (S.has(E[0])) {  // S に キー(名前)が E[0] の要素が含まれている場合…
            S.set(E[0], S.get(E[0]) + Number(E[2]));  // キーが E[0] の要素を上書き
         } else {  // 含まれていない場合…
            S.set(E[0], Number(E[2]));  // S に {E[0], Number(E[2]} の要素を追加
         }
         break;
         case 'join':  // E[1] が "join" なら…
         M.push(E[0]);  // M (メンバーシップ)に E[0] を追加
         break;
      } S
   }
   const A = [];
   S.forEach((value, key) => {
      A.push([key, value]);  //  AS の 各要素を 配列 にして保存
   });
   A.sort();  // AA[i][0](名前) を基準に50音順に並替え
   A.reverse();  // A[i][0] を基準に逆順に並替え
   A.sort((s, b) => b[1] - s[1]);  // AA[i][1](金額) を基準に降順に並替え
   M.sort();  // M を 50音順に並替え
   A.forEach(a => {
      console.log(a[0]);  // A[i][0](名前) を出力
   });
   M.forEach(m => {
      console.log(m);  // M の各要素(メンバーシップ加入者名) を出力
   });
});
hogeちゃんの画像

スーパーチャットの情報を マップに保存して メンバーシップ加入者名は配列に保存。50音順の降順への並べ替えは sort() を行った後 reverse()を実行しました。

コメント