Paizaで「N を 0 にできるか?」という謎のミッションに挑戦!ルールは簡単なのに、条件が4パターンもあって書くのが面倒…。最近学んだ論理式( ||
)を使って少し簡単にしてみた!
■ 問題概要
整数 N
, A
, B
が入力される。
- 「N に A を足す or 引く」
- 「N に B を足す or 引く」
この2ステップを1回ずつ使って、N を 0 にできるか判定せよ!
入力例:
-10 8 2
出力例:
YES
考え方(設計図)
操作は「+A or −A」と「+B or −B」の2通りずつ。
つまり組み合わせは全部で 4パターン:
N + A + B
N + A – B
N – A + B
N – A – B
この中に「0
」になるものがあれば YES
、なければ NO
!
✅コード例:条件分岐
const rl = require('readline').createInterface({input:process.stdin});
rl.once('line',(input) => {
const [N,A,B] = input.split(' ').map(Number)
if (N + A + B === 0){
console.log('YES');
}
else if (N + A - B === 0){
console.log('YES');
}
else if (N - A + B === 0){
console.log('YES');
}
else if (N - A - B === 0){
console.log('YES');
}
else{
console.log('NO');
}
rl.close();
});
👆これも悪くないけど、最近勉強した ||
を使って少し短くできそう!
✅コード例:||でスマートに!
if (
N + A + B === 0 ||
N + A - B === 0 ||
N - A + B === 0 ||
N - A - B === 0
) {
console.log("YES");
} else {
console.log("NO");
}
-
||
を使うことで「どれかひとつでもtrue
ならOK!」という自然な書き方に!
気づきメモ ✍️
-
||
は「または」を意味する論理演算子。複数条件を1つのif
文にまとめられる。 - 分かりやすく簡潔に書くと、ケアレスミス防止につながる!
まとめ
条件分岐にも、いろいろな工夫や書き方がある!
💡おまけ:コード例
✅ 配列+ループで簡潔に
const ops = [+A, -A], bOps = [+B, -B];
for (let a of ops) {
for (let b of bOps) {
if (N + a + b === 0) ok = true;
}
}
Aに対して+Aと-A、Bに対して+Bと-Bをそれぞれループさせて試す。
N + a + b === 0でチェック。
- パターンの増加にも柔軟に対応可能。
✅ 関数化
function canMakeZero(N, A, B) {
const candidates = [
N + A + B,
N + A - B,
N - A + B,
N - A - B
];
return candidates.includes(0);
}
const rl = require('readline').createInterface({ input: process.stdin });
rl.once('line', (line) =>
const [N, A, B] = line.split(' ').map(Number);
console.log(canMakeZero(N, A, B) ? "YES" : "NO");
rl.close();
});
- ロジックを関数にまとめてメイン処理をスッキリ。
-
.includes(0)
で0
が作れるかを判定。
✅三項演算子で1行にまとめる
const r = [n+a+b, n+a-b, n-a+b, n-a-b].includes(0) ? 'YES' : 'NO';
console.log(r);
- 一行にまとめて短く表現。
✅Setで0が存在するかチェック
const results = new Set([
N + A + B,
N + A - B,
N - A + B,
N - A - B
]);
console.log(results.has(0) ? "YES" : "NO");
-
set
と.has(0)
で0
が存在するか簡単に判定。 -
.Set()
を使ってユニークな操作結果を格納。