LoginSignup
0
0

More than 1 year has passed since last update.

ABC151 C - Welcome to AtCoder から学んだ

Last updated at Posted at 2021-09-14

abc151_1.png

うーん、いけそう。

abc151_2.png

だが、しかし wa.

WelcomToAtcoder_r0.py
N,M = map(int,input().split())

memo = [False]*N
wa = 0
for _ in range(M):
    p,S = input().split()
    p = int(p)-1
    if not memo[p] and S == "WA":#AC未 get 問題で wa なら インクリメント
        wa += 1
    elif S == "AC":#AC なら memo を ture.AC は後で true の数を数えればいい。
        memo[p] = True
ac = memo.count(True)
print("{} {}".format(ac,wa))

なぜ wa なのか分からなかったから、
テストケースを確認した。

愕然とした。
問題文には AC を初めて出すまでの WA の数とある。
前述の記述では一個も AC が無い場合、WA の数を無限に数えるのではないだろうか?

WelcomToAtcoder_r1.py
N,M = map(int,input().split())

memo = [False]*N
wa = [0]*N
for _ in range(M):
    p,S = input().split()
    p = int(p)-1
    if not memo[p] and S == "WA":
        wa[p] += 1
    elif S == "AC":
        memo[p] = True

WA = 0
AC = memo.count(True)
for i in range(N):
    if memo[i]:#正解するまでの WA をカウント
        WA += wa[i]
print("{} {}".format(AC,WA))

再チャレンジ、ちゃんと理解してるかな。

問題文を読んで頭に浮かんだのは
以下のエッジケース。

edge_case.py
2 5
1 WA
1 AC
2 WA
2 WA
2 WA

AC が出るまでの WA カウントが正常にできるパターンと、
AC が出ずに WA が続くパターンの混在。
対策としては、各 N 問ずつ WA をメモするリストと、
AC を True / False でメモするリストを併用して管理する必要がある。

abc151c.py
N,M = map(int,input().split())
AC_memo = [False]*N                       #AC をメモ
WA_memo = [[] for _ in range(N)]          #WA をメモ

for _ in range(M):
    p,s = input().split()
    p = int(p)
    if not AC_memo[p-1] and s == "WA":    #未AC かつ WA なら WA としてメモ
        WA_memo[p-1].append("WA")
    elif not AC_memo[p-1] and s == "AC":  #未AC かつ AC なら AC としてメモ
        AC_memo[p-1] = True

AC = AC_memo.count(True)                  #ACは簡単。True を数えるだけ
WA = 0
for i in range(N):                        #i番目の問題で WA 数をカウントしたい
    if AC_memo[i] and len(WA_memo[i]) > 0:#条件として AC_memo[i] が True である必要がある
        WA += len(WA_memo[i])

print(AC,WA)

よかった。書き方にはスマートさが足りないが
ポイントを突くことが出来て、無事 AC.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0