Pythonのリスト内包表記は便利。AtCoderBeginnerContest 167のA・B問題解いてみた。

最近プログラミングを始めたのですが、「AtCoder」という競技プログラミングのコンテストにはまっています。

f:id:space-tiger:20200512180306p:plain
AtCoder

AtCoderの特徴としては以下が挙げられます。

  • 毎週末オンライン開催
  • A〜Fまで、全6問
  • 使用言語の選択肢が非常に多い
  • レートに応じた「色」が与えられる

今回、3回目の挑戦で初めてA・Bの2問でAC(正解)を出せたので、記念にエントリを書きます。

前提

  • プログラミング学習2ヶ月目
  • 使用言語:Python
  • 167はタイムシフト参加。自分で1.5時間はかった。

A - Registration

一部が違う文字列2つが与えられて、その比較をする問題。

文字列を1文字ずつリストに格納していく方法、配列の最後を指定する方法が分からなかったので、ググりながら進めました。

答えが分からなくても、答えを探す方法を知っていれば道が拓けることが、プログラミングやってて楽しいところです。

# coding: utf-8
# Your code here!

# 標準入力から2つの文字列を受け取る
bad_id = input()
co_id = input()

# 文字列を1文字づつ配列に入れる
bad_id_array = [bad_id[i: i+1] for i in range(0, len(bad_id), 1)]
co_id_array = [co_id[i: i+1] for i in range(0, len(co_id), 1)]

# co_id_arrayから最後の1文字を削除
co_id_array.pop(-1)

# bad_id_array と co_id_arrayを比較して、出力する
if bad_id_array == co_id_array:
    print("Yes")
else:
    print("No")

https://atcoder.jp/contests/abc167/submissions/13097605


B - Easy Linear Programming

参加したABCのB問題の中では、今までで一番かんたんな問題に思えました。

標準入力で受け取った4つの数字をそれぞれ変数として処理していく問題。

一度、コピペミス・コードチェック不足でWAを食らってしまいましたが、すぐに修正できました。

# coding: utf-8

#標準入力で受け取り配列に入れる
num_line = input().split()

#配列から変数を取り出す
num_one = int(num_line[0])
num_zero = int(num_line[1])
num_mini = int(num_line[2])
num_amount = int(num_line[3])

#num_oneから順に取っていく
if num_one >= num_amount:
    print(num_amount)
elif num_one + num_zero >= num_amount:
    print(num_one)
else:
    #マイナスの数を計算して保存
    minus_count = num_amount - (num_one + num_zero)
    print(num_one - minus_count)

https://atcoder.jp/contests/abc167/submissions/13100164


リスト内包表記はすごい

バイト先のエンジニアの方が、B問題をサクッとコードレビューしてくださいました。

#標準入力で受け取り配列に入れる
num_line = input().split()
 
#配列から変数を取り出す
num_one = int(num_line[0])
num_zero = int(num_line[1])
num_mini = int(num_line[2])
num_amount = int(num_line[3])

この部分。

「リスト内包表記」を使うと楽に書けるよ、と教えてもらいました。

num_one,num_zero,num_mini,num_amount = [int(i) for i in input().split()]

5行のコードが1行にまとまってしまった。
これは競技プログラミングやるにあたって、必須の知識だなあ。

ただリスト内包表記は可読性が悪いので、誰かと協働してコードを書く時には向かない、と。

今後の課題

今回ABまで解ききれたのは、

  • タイムシフト参加で緊張しなかった
  • たまたま分かる問題が出た

とラッキーな要素も多かった。

今月はABが安定して解け、Cにも挑戦できることを目標にします。

for文・while文・配列の扱いを、手を動かしつつもっと慣れていきたいです。