クエリメニュー【アイドルグループ・歴史を作る時間・銀行・経理・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]); // A に S[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;
}
}
});
セットに メンバーの名前を保存し イベント毎に処理を振り分け追加・削除・並べ替えと表示を実行。ただし セットは値の並べ替えができないので 並べ替える前に配列の値として展開しました。
【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(); // A を A[i][0](名前) を基準に 50音順に並替え
A.sort((s, b) => s[1] - b[1]); // 更に A[i][1](年) を基準に 昇順に並替え
A.forEach(a => {
console.log(a[0]); // 名前 を出力
});
});
問題の指示通りの順序で出力するために 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](金額)を出力
});
});
マップに取引前の情報(key=会社名 値=[暗証番号, 残高])を保存。会社名と暗証番号が一致すれば 残高 − W。forEach()
で 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('-----');
});
});
こちらも データを マップに保存。マップは文字列を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]); // A に S の 各要素を 配列 にして保存
});
A.sort(); // A を A[i][0](名前) を基準に50音順に並替え
A.reverse(); // A[i][0] を基準に逆順に並替え
A.sort((s, b) => b[1] - s[1]); // A を A[i][1](金額) を基準に降順に並替え
M.sort(); // M を 50音順に並替え
A.forEach(a => {
console.log(a[0]); // A[i][0](名前) を出力
});
M.forEach(m => {
console.log(m); // M の各要素(メンバーシップ加入者名) を出力
});
});
スーパーチャットの情報を マップに保存して メンバーシップ加入者名は配列に保存。50音順の降順への並べ替えは sort()
を行った後 reverse()
を実行しました。
コメント