ABC151 C - Welcome to AtCoder

備忘録

問題

atcoder.jp

回答

"use strict"
function Main(input) {
  input = input.trim().split('\n');
  const N = input[0].trim().split(' ').map(Number)[0];
  const M = input[0].trim().split(' ').map(Number)[1];
  const P = input.slice(1, M+1);

  let ans = new Array();
  for(let i=0; i<N; i++){
    ans.push([0, 0]);
  }

  for(let i=0; i<M; i++){
    let p = P[i].trim().split(' ')[0];
    let S = P[i].trim().split(' ')[1];
    if(ans[p-1][0] === 1) continue;

    if(S === 'WA'){
      ans[p-1][1] += 1;
    } else {
      ans[p-1][0] += 1;
    }
  }

  let ac = 0;
  let wa = 0;
  for(let i=0; i<N; i++){
    if(ans[i][0] > 0) {
      ac += ans[i][0];
      wa += ans[i][1];
    }
  }
  console.log(ac, wa);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));

考え方

inputから正答数とペナルティ数を出力する。

正答数

  • 初めてACを出した場合 +1
  • 2度目以降は加算されない。

ペナルティ数

  • 初めてACを出すまでのWA数
  • 一度もACを出していない場合にはWA数をペナルティ数として加算しない。
  • 一度、ACを出した時、はじめのAC以降のWA数をペナルティ数として加算しない。

上記の条件で正答数とペナルティ数を算出する。

回答コードでは、はじめに2つの値([0, 0])を持った長さNの配列(ans)を作った。
この2つの値は1つ目の値がACの数、2つ目の値をWAの数とした。
(Nは問題数)

あとは回答した数(M)だけループし、 上記の条件に従って、配列(ans)の値を増加させる。

最後に配列(ans)をすべて確認し、AC(1つ目の値)が1以上の場合には、
1つ目の値をACに加算、2つ目の値をWAに加算した。