今回の問題で、条件分岐メニューの問題は最後!
問題概要
A から B までの整数から 2 つ選んで掛け算し、その最小値を出す。
※同じ値を使ってもよい。
入力例:
3 5
出力例:
9
❌NG例:1
const rl = require('readline').createInterface({input:process.stdin});
rl.once('line', (input) => {
const [A, B] = input.split(' ').map(Number);
const result = A ** 2; // これだとAが負のとき大間違い!
console.log(result);
rl.close();
});
どちらも正の数の場合は、最小である A と A をかければいいけど…。
❌NG例:2
const rl = require('readline').createInterface({input:process.stdin});
rl.once('line', (input) => {
const [A, B] = input.split(' ').map(Number);
if (A >= 0) {
console.log(A ** 2);
}
else {
// ここもBが負かどうか考えないとアウト!
console.log(A * B);
}
rl.close();
});
✅OK例
const rl = require('readline').createInterface({input:process.stdin});
rl.once('line', (input) => {
const [A, B] = input.split(' ').map(Number);
// AとBどちらも正の数の場合
if(A >= 0 && B >= 0){
const result = A ** 2;
console.log(result);
}
// AとBどちらも負の数の場合
else if(A <= 0 && B <= 0){
const result = B ** 2;
console.log(result)
}
// Aは負の数、Bは正の数の場合
else if (A <= 0 && B >= 0){
const result = A * B;
console.log(result);
}
rl.close();
});
📝気づきメモ
- 負×負=正:プラスになっちゃうので要注意!
- 積の最小値は範囲の端だけ確認すればOK。中間は無視で大丈夫。
まとめ
今回のPaiza問題、端っこだけ確認するだけでスッキリ解決できるって気づけるかとすべての場合を考えるのが大事!
💡おまけ
const rl = require('readline').createInterface({ input: process.stdin });
rl.once('line', (line) => {
const [A, B] = line.split(' ').map(Number);
// 考えられる最小積候補
const candidates = [
A * A,
A * B,
B * A, // 実際には不要
B * B
];
const minValue = Math.min(...candidates);
console.log(minValue !== 0 ? minValue : 0);
rl.close();
});
✅ 同じ値の組み合わせも OK
✅ 範囲の端だけ見れば良い
✅ 4つの候補から最小値を探すだけ!
📌 minValue !== 0 ? minValue : 0 をする理由
JavaScript では、負の数(例えば -1
)に 0
を掛けると、-0
になる。
0 と -0 は同じ0だけど、厳密には違う値として扱われ、間違いとして減点されてしまった。
📌でも、===
で比較するときは:
0 === -0 // true