【条件判定 2】視力検査 (paizaランク C 相当)
解答例
コードが少し長くなったので、細かなところのミスに気をつけました。
2 回失敗する前に 2 回成功した場合、その段階について「合格」、それ以外の場合を「不合格」
なので、先に2回失敗したら、その後2回以上成功しても不合格判定なので、eye配列で、未判定、失敗、成功を保持するようにしました。eye配列のインデックスが小さい順にA,B,C,Dと対応しています。
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
const [N] = lines[0].split(" ").map(Number);
const eye = Array(4).fill(-1);//視力、未判定-1、失敗0、成功1
const success = Array(4).fill(0);//テスト成功数
const failure = Array(4).fill(0);//テスト失敗数
//視力テスト
for (let i = 1; i <= N; i++) {
const [T, J] = lines[i].split(" ");
if (T === "TA") {
if (J === "ok") {
success[0] += 1;
} else {
failure[0] += 1;
}
} else if (T === "TB") {
if (J === "ok") {
success[1] += 1;
} else {
failure[1] += 1;
}
} else if (T === "TC") {
if (J === "ok") {
success[2] += 1;
} else {
failure[2] += 1;
}
} else if (T === "TD") {
if (J === "ok") {
success[3] += 1;
} else {
failure[3] += 1;
}
}
//合格判定
for (let j = 0; j < 4; j++) {
if (success[j] === 2 && failure[j] < 2 && eye[j] === -1) {
eye[j] = 1;//成功
} else if (failure[j] === 2 && success[j] < 2 && eye[j] === -1) {
eye[j] = 0;//失敗
}
}
}
//視力結果
const result = eye.indexOf(1);
if (result === 0) {
console.log("A");
} else if (result === 1) {
console.log("B");
} else if (result === 2) {
console.log("C");
} else if (result === 3) {
console.log("D");
} else {
console.log("E");
}
解答例(C++の場合参考)
視力テストをするところを関数にした。
視力レベルを表すインデックスを活用した。(A=0,B=1,C=2,D=3,E=4)
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
let tester_level = 4;//視力を表すインデックス、初期値4はE相当
const ok = Array(4).fill(0);//テスト成功数
const ng = Array(4).fill(0);//テスト失敗数
//ok,ngのインデックスが視力に対応
//視力テストの関数定義
const tests = (level, result) => { //level:視力レベルを表すインデックス、result:okまたはng
if (result === "ok") {
ok[level]++;
} else {
ng[level]++;
}
if (ok[level] === 2 && ng[level] < 2) { //ok2回、ng2回より前に。ng2回以上ならok2回以上でも不合格
tester_level = Math.min(tester_level, level);//合格した段階のうち、最も良い段階優先
}
};
//メイン
const [n] = lines[0].split(" ").map(Number);
//test_nameとlevel_nameのインデックスを視力レベルに対応させる
const test_name = ["TA", "TB", "TC", "TD"];
const level_name = ["A", "B", "C", "D", "E"];
for (let i = 1; i <= n; i++) {
const [test, result] = lines[i].split(" ");
//合格判定
for (let j = 0; j < 4; j++) { //インデックスjが視力レベルに相当
if (test === test_name[j]) {
tests(j, result);//視力テスト
}
}
}
//視力結果
console.log(level_name[tester_level]);