くぅ~疲れました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匹購入
※コオロギにはコオロギを食べさせてあげまちゅね(ニッコリ