2
1

くぅ~疲れましたw

やっとJavaScriptで問題が一通り終わったよ~!
次回【Javaで2周目】、ディエルスタンバイ!!

面倒くさいので画面パタメータをListでもらった後のFunctionだけ

ちなみに引数のListを作ってる箇所はこっちの記事に書いてあるYO!!

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 行となり、入力値最終行の末尾に改行が 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
※コオロギにはコオロギを食べさせてあげまちゅね(ニッコリ

ce0d668f-4aac-479b-8d25-b34a93323f27.jpg
見よ、このボッテボテの腹、もはやブタ
※消化不良とか気をつけないとなぁ。。。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1