今回は paiza の「【条件判定 2】視力検査」の問題に挑戦!
問題概要
- 視力は A 〜 E の5段階。
- 視力判定にはテスト TA, TB, TC, TD があり、それぞれ段階 A, B, C, D に対応する。
- テストの判定ルール:
- 同じ段階で「成功2回」する前に「失敗2回」したら → 不合格
- 同じ段階で「失敗2回」する前に「成功2回」したら → 合格
- 判定結果は 合格した段階のうち最も良い段階(Aに近いほど良い) が視力になる。
- どの段階にも合格しなかった場合は E とする。
入力例:
4
TA ok
TA ng
TA ng
TA ok
出力例:
E
✅ OK例:
const rl = require("readline").createInterface({ input: process.stdin });
const lines = [];
rl.on("line", (input) => lines.push(input));
rl.on("close", () => {
const n = Number(lines[0]);
const tests = lines.slice(1).map((line) => line.split(" "));
// テスト名を段階に対応づけ
const mapTestToLevel = {
TA: "A",
TB: "B",
TC: "C",
TD: "D",
};
// 成功・失敗カウント
const success = { A: 0, B: 0, C: 0, D: 0 };
const fail = { A: 0, B: 0, C: 0, D: 0 };
// 判定状態
const passed = { A: false, B: false, C: false, D: false };
const rejected = { A: false, B: false, C: false, D: false };
for (const [test, result] of tests) {
const level = mapTestToLevel[test];
// すでに合格 or 不合格なら無視
if (passed[level] || rejected[level]) continue;
if (result === "ok") {
success[level]++;
} else {
fail[level]++;
}
if (success[level] === 2) {
passed[level] = true;
} else if (fail[level] === 2) {
rejected[level] = true;
}
}
// 最も良い段階を出力
if (passed["A"]) {
console.log("A");
} else if (passed["B"]) {
console.log("B");
} else if (passed["C"]) {
console.log("C");
} else if (passed["D"]) {
console.log("D");
} else {
console.log("E");
}
});
🔹入力を受け取る
- 1行目にテスト回数
N - 2行目以降に
テスト名 結果(TA okなど)
🔹テスト名を段階 (A~D) にマッピング
const mapTestToLevel = { TA:"A", TB:"B", TC:"C", TD:"D" };
🔹各段階で成功回数・失敗回数をカウント
success[level]fail[level]
🔹判定
- 成功が2回に達したら
passed[level] = true - 失敗が2回に達したら
rejected[level] = true - どちらかが確定したら以降はその段階を無視
🔹最終的な視力判定
- 上から順に A → B → C → D をチェック
- 最初に passed したものが視力
- どこも合格していなければ
"E"
🗒️ まとめ
-
段階ごとに独立して判定する必要がある(AのテストはA判定だけに影響)。
-
「成功/失敗」を カウントして早い方が2に到達したら確定。
-
確定した段階はそれ以降の入力を無視する。
-
最終的に合格がある場合は A→B→C→D の優先順位で決定。
-
合格が一つもない場合は E を出力する。