[paiza]1周目完走（【殿堂入りキャンペーン】村人の友好関係 (paizaランク S 相当)

# くぅ～疲れましたw
やっとJavaScriptで問題が一通り終わったよ～！
次回【Javaで2周目】、ディエルスタンバイ！！

https://paiza.jp/works/mondai/s_rank_skillcheck_archive/group_popularity

# 面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所は[こっちの記事](https://qiita.com/AsilHatake/items/842548e48ae4a0eae119)に書いてあるYO!!

```javascript:groupPopularity.js
// [問題文（原文）]
// あなたは今「PAIZA の村」という、村人と交流しながら生活していくゲームで遊んでいます。
// 村人は合計で N 人であり、各村人は 1 ～ N で番号付けられています。
// このゲームの目的の一つは村の人々と仲良くなることです。
// これを示すパラメータとして、各村人と村人の間には「友好度」と呼ばれる非負整数が定められています。
// 
// あなたは、この村で同好会グループを作りました。
// 村人はこの同好会グループに自由に入会でき、自由に退会することもできます。
// あなたは、この同好会グループの管理者でもあるので、グループの人気度を常に把握しなければなりません。
// グループの人気度は、グループ内の村人とグループ外の村人の間の友好度のうちの、最大の友好度です。
// ただし、グループ が 0 人または N 人の場合はそのグループの人気度は 0 であるとします。
// 
// 同好会の入退会ログが与えられるので、ログが更新されるごとに同好会グループ全体の人気度を求めてください。
// 
// 例えば、入力例 1 を説明する図は以下のようになります。
// 
// 3 2 3
// 1 2 1
// 1 3 3
// + 1
// + 2
// - 1
// 
// この例では、村人 1 と村人 2 の友好度は 1、村人 1 と村人 3 の友好度は 3、村人 2 と村人 3 の友好度は 0 です。
// ・ 同好会に村人 1 が入ると、同好会グループ全体の人気度は、「村人 1 と村人 2 の友好度」と「村人 1 と村人 3 の友好度」の最大値なので、3 です。
// ・ さらに同好会に村人 2 が入ると、同好会グループ全体の人気度は、「村人 1 と村人 3 の友好度」と「村人 2 と村人 3 の友好度」の最大値なので、3 です。
// ・ 同好会から村人 1 が抜けると、同好会グループ全体の人気度は、「村人 2 と村人 1 の友好度」と「村人 2 と村人 3 の友好度」の最大値なので、1 です。
function groupPopularity(lines) {
  // 入力は以下のフォーマットで与えられます。
  // N M Q
  // a_1 b_1 f_1
  // a_2 b_2 f_2
  // ...
  // a_M b_M f_M
  // op_1 q_1
  // op_2 q_2
  // ...
  // op_Q q_Q
  // 
  // ・ 1 行目にそれぞれ村人の人数を表す整数 N、友好関係の数を示す整数 M、ログが更新される回数を表す整数 Q がこの順で半角スペース区切りで与えられます。
  // ・ 続く M 行のうちの i 行目 (1 ≦ i ≦ Q) には村人間の友好度の情報が与えられます。各行は、「村人 a_i と村人 b_i の友好度は f_i である」ということを表します。ただし、入力に現れない村人の間の友好度は 0 です。
  // ・ 続く Q 行のうちの i 行目 (1 ≦ i ≦ Q) には同好会に入会、または退会する村人の情報が与えられます。まず同好会に新たにメンバーが増えるのか、減るのかを示す記号 op_i が与えられます。op_i が "+" の場合、同好会に新たに加わる村人がいることを示し、"-" の場合、同好会から抜ける村人がいることを示します。次に入会または退会する村人の番号を表す整数 q_i が与えられます。
  // ・ 入力は合計で M + Q + 1 行となり、入力値最終行の末尾に改行が １ つ入ります。

  const friendMap = {};
  /**
   * まず友好関係の組み合わせを簡単に取得できるようなJSONを作成する
   * {
   *   村人No : {
   *     isJoin : boolean; // 同好会に所属してるかどうか
   *     max : number; // 各メンバーとの最大交友度
   *   }
   * }
   */
  const [N, M, Q] = lines[0].split(" ").map(Number);
  for (let i = 1; i <= N; i++)
    friendMap[String(i)] = { isJoin: false, max: 0 };

  // 友好度設定
  lines.slice(1, M + 1).forEach((line) => {
    const [a, b, f] = line.split(" ");
    const fNum = Number(f);
    friendMap[a].max = Math.max(friendMap[a].max, fNum);
    friendMap[b].max = Math.max(friendMap[b].max, fNum);
  });

  // ログ監視
  lines.slice(M + 1).forEach((line) => {
    // 人の増減設定
    const [op, q] = line.split(" ");
    if (op === "+")
      friendMap[q].isJoin = true;
    else if (op === "-")
      friendMap[q].isJoin = false;

    // 所属してる人員を取得
    const friendList = Object.values(friendMap).filter((friend) => friend.isJoin);
    if (friendList.length === 0 || friendList.length === N) {
      // (問題文抜粋)ただし、グループ が 0 人または N 人の場合はそのグループの人気度は 0 であるとします。
      console.log(0);
      return;
    } else {
      // 期待する出力
      // 入力の各行で表されるログ変更に対して、同好会グループ全体の人気度を 1 行に出力してください。
      // ・ 出力の最後に改行を入れ、余計な文字、空行を含んではいけません。
      console.log(Math.max(...friendList.map((friend) => friend.max)));
    }
  });
}

module.exports = {
  groupPopularity
};
```

## 結局のところ
その人の最大の友好度を保持して、その人が所属してればその値を比較して出せばいいんだよね？
`1 3 3`←こうやってくるから、
1の人と3の人は3の友好度を持ってるみたいな考え方で、
例えば次に`2 3 5`ってきたら、
2の人と3の人は5の友好度を持っていて、
3の人は1の人とは友好度3だけど2の人とは友好度5だから5のほうが優先だよねって感じで考えてたんだが？

# まぁ何にせよ。。。
とりあえずJavaScriptで（チェック云々は一旦さておき）全問解けたので、次はJavaでダラダラと解いていってみようかなと。

# 【飼育観察】金の力を使う
ほぼ毎朝、犬の運動も兼ねて庭に出てカナヘビのご飯（主に蜘蛛）を調達してるわけですが、
そこはやはり自然、採取できる数が安定しないということも有り、
課金してヨーロッパイエコオロギSSを50匹購入
![924d7342-0f4b-4a50-a2b9-8dc2a81ef3b5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/c385a04d-8bea-d25a-7ac1-80055e4aa61f.jpeg)
※コオロギにはコオロギを食べさせてあげまちゅね（ﾆｯｺﾘ

![ce0d668f-4aac-479b-8d25-b34a93323f27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996378/cda3b5b6-4377-2235-73fd-4922d346a36d.jpeg)
見よ、このボッテボテの腹、もはやブタ
※消化不良とか気をつけないとなぁ。。。