paizaの森練習問題コンテスト(2022年12月開催)の過去問
【占い】コード
reader.on('close', () => {
const n = Number(lines[0]); // 入力を n で受取り
console.log(n === 7 ? 'Yes' : 'No'); // n が true なら'Yes', false なら 'No' を出力
});
入力を数値化して n で受け取り 三項演算子で出力値を振り分けました。
【年収計算】コード
reader.on('close', () => {
const [a, b, c] = lines[0].split(' ').map(Number);
if (c < 5) { // 5年未満
console.log(a);
} else if (c < 10) { // 5年以上10年未満
console.log(a + b);
} else if (c < 15) { // 10年以上15年未満
console.log(a + b * 2);
} else if (c < 20) { // 15年以上20年未満
console.log(a + b * 3);
} else { // 20年以上10年未満
console.log(a + b * 4);
}
});
5年毎に給料が up。if文 で条件分岐して出力しています。
【気温】コード
reader.on('close', () => {
const X = Number(lines[0]);
if (X >= 35) { // 35度以上
console.log('extremely hot day');
} else if (X >= 30) { // 30度以上35度未満
console.log('hot summer day');
} else if (X >= 25) { // 25度以上30度未満
console.log('summer day');
} else if (X < 0) { // 0度未満
console.log('ice day');
} else { // その他
console.log('normal day');
}
});
余談ですが 温暖化で 猛暑日が増えましたね。そのうち 40度以上 の カテゴリーができるかも??
【気温2】コード
reader.on('close', () => {
const X = lines[1].split(' ').map(Number);
const [H, L] = [Math.max(...X), Math.min(...X)]; // 最高値(H)と最低値(L)を抽出
console.log(H - L);
});
Math.max()
で最高値・Math.min()
で最低値を抽出することができました。【5】コード
reader.on('close', () => {
const [n, m] = lines[0].split(' ').map(Number);
let block_num = 0; // 敷き詰めるブロックの数
if (n % 2 === 0) { // n が 2 で割り切れる場合
block_num = n / 2 * m;
} else { // n が 2 で割り切れない場合
block_num = parseInt(n / 2) * m + parseInt(m / 2);
}
console.log(block_num);
});
縦長に敷き詰めてから 隙間があれば横長に敷き詰める感じで。
【最も大きな最大公約数】コード
reader.on('close', () => {
const n = Number(lines[0]);
let ans = 1;
for (let i = 1; i < n; i++) {
for (let j = i + 1; j <= n; j++) {
const GCD = gcd(j, i);
// 関数 gcd() を呼び出して戻り値を GCD に代入
if (GCD > ans) { // GCD が ans より大きければ ans の値を上書き
ans = GCD;
}
}
}
// ここから 最大公約数を求める関数 (ユークリッドの互除法)
function gcd(a, b) {
while (a && b) {
a %= b; // a で b を割り a をその余りで置き換え
[a, b] = [b, a]; // a, b の値を置換
}
return a;
}
console.log(ans);
});
ユークリッドの互除法はこちら。
【三冠王】
reader.on('close', () => {
const n = Number(lines[0]);
const A = new Array(n); // 打率
const R = new Array(n); // 打点
const H = new Array(n); // 本塁打
let Triple = false; // 三冠王ならtrueで上書き
let Double = false; // 二冠王ならtrueで上書き
for (let i = 1; i <= n; i++) {
// 入力値を ave, rbi, h_run で受け取り A, R, H に保存
const [ave, rbi, h_run] = lines[i].split(' ').map(Number);
[A[i - 1], R[i - 1], H[i - 1]] = [ave, rbi, h_run];
}
// 配列 A, R, H の最大値を取得して A_max, R_max, H_max に代入
const [A_max, R_max, H_max] = [Math.max(...A), Math.max(...R), Math.max(...H)];
for (let i = 0; i < n; i++) {
if (A[i] === A_max && R[i] === R_max && H[i] === H_max) {
Triple = true; // 3 つの値が各最大値と一致すれば三冠王
break;
} else if (A[i] === A_max && R[i] === R_max ||
A[i] === A_max && H[i] === H_max ||
R[i] === R_max && H[i] === H_max) {
Double = true; // 2 つの値が各最大値と一致すればニ冠王
}
}
if (Triple) { // Triple が true なら
console.log('Triple');
} else if (Double) { // Double が true なら
console.log('Double');
} else { // 該当しなければ
console.log('Nobody');
}
});
問題文の通り 条件分岐しました。
コメント