配列活用メニュー【傾斜配点・内定・queue(9)係・二人三脚・場所取り・ボウリング・集団行動】
【STEP: 1】コード
reader.on('close', () => {
const N = Number(lines[0]);
const M = lines[1].split(' ').map(Number);
const total = []; // 各受験者の合計得点を保存
for (let i = 2; i < N + 2; i++) {
const A = lines[i].split(' ').map(Number); // 各科目の得点
for (let j = 0; j < 5; j++) {
A[j] *= M[j]; // 点数を点数✕科目の重みで上書き…①
}
total.push(A.reduce((a, c) => a + c)); // totale に A の値の合計を保存…②
}
console.log(Math.max(...total)); // totalの最大値を出力…③
});
①配列 A の各要素に対し index が一致する 配列 M の要素を乗算した値で上書き。②配列 totale に A の値を足し合わせた値を保存。③配列 total をスプレッド構文(…total)で展開してMath.max()
で最大値を抽出。
【STEP: 2】コード
reader.on('close', () => {
const [N, K, M] = lines[0].split(' ').map(Number);
const A = [];
let ans = 0; // 内定者の人数(0で初期化)…①
for (let i = 1; i <= N; i++) {
A.push(Number(lines[i]));
}
for (let i = 0; i < N; i++) {
if (A[i] >= K) { // Aの値がK以上なら内定(ans++)…②
ans++;
}
}
ans -= M; // →③
console.log(ans >= 0 ? ans : 0);
});
①内定者の人数を保存する変数 ans を宣言。②A の値が K 以上なら ans++。③ans から M を減算。
【STEP: 3】コード
reader.on('close', () => {
const N = Number(lines[0]);
const A = [];
for (let i = 1; i <= N; i++) {
const S = lines[i].split(' ');
switch (S[0]) {
case 'out':
A.shift();
break;
case 'in':
A.push(S[1]);
break;
}
}
A.forEach(a => {
console.log(a);
});
});
switch文 で条件分岐。S[0]
が ″out″ の時は shift()
で先頭の要素を削除。 ″In″ の時は push(S[1]
で S[1]
を追加。
【STEP: 4】コード
reader.on('close', () => {
const N = Number(lines[0]);
const A = [];
for (let i = 1; i <= N; i++) {
A.push(Number(lines[i]));
}
A.sort((s, b) => s - b);
const ans = [A[0], A[1]];
for (let i = 2; i < N; i++) {
if (A[i] - A[i - 1] < ans[1] - ans[0]) {
[ans[0], ans[1]] = [A[i - 1], A[i]];
}
}
console.log(ans[0] + '\n' + ans[1]);
});
A を小さい順に並べ替えて ans の値の初期値を
A[0], A[1]
に設定。もし A[i] - A[i - 1]
が ans[1] - ans[0]
より小さければ ans の各値を上書き。【STEP: 5】コード
reader.on('close', () => {
const [N, K, F] = lines[0].split(' ').map(Number);
const A = [];
for (let i = 1; i <= K; i++) {
A.push(Number(lines[i]));
}
A.splice(0, F);
const S = new Set(A);
S.forEach(s => {
console.log(s);
});
});
先ず配列 A に K 個 のデータを保存。K 個 のデータから splice(0, F)
で F 個 のデータを切り取り Set(A)
で重複を削除
【STEP: 6】コード
reader.on('close', () => {
let P = [];
for (let i = 3; i >= 0; i--) {
P.push(lines[i].split(' ').map(Number).reverse());
}
P = P.flat();
for (let i = 0; i < 10; i++) {
if (P[i]) {
console.log(i + 1); // 狙うピン
break;
}
}
console.log(P.reduce((a, c) => a + c)); // 残数
});
ピンの番号-1 を配列の index に置き換え 昇順に並べたいので for文 で lines[3]
〜 lines[0]
の順にデータを取得し 更に各行のデータを逆順に並べ替えた配列を P に保存。P.flat()
で 多次元配列をフラット化。
【FINAL】コード
reader.on('close', () => {
const [N, Q] = lines[0].split(' ').map(Number);
let S = [];
for (let i = 1; i <= N; i++) {
S.push(i);
}
for (let i = 1; i <= Q; i++) {
const s = lines[i].split(' ');
switch (s[0]) {
case 'swap':
[S[s[1] - 1], S[s[2] - 1]] = [S[s[2] - 1], S[s[1] - 1]];
break;
case 'reverse':
S.reverse();
break;
case 'resize':
S = S.slice(0, s[1]);
break;
}
}
S.forEach(s => {
console.log(s);
});
});
for文 で Q 行の指示を 配列 s として順次取得し 問題の指示通り s[0]
の値で条件分岐。配列 S の値を上書きし 出力。
コメント