アルゴリズムの思考力をつけようと思って競技プログラミングを解いてみることにしました。
AtCoderに登録したので、042からのABC問題を解いていきます。まずはAのみを解いていきます!
普段使用している言語はJavaなのですが、実行スピードとか書きやすさにおいてはC++やPythonがおすすめみたいです。
せっかくなのでPythonを勉強するためにも、Pythonで挑んでいきます!
PythonでAtCoderに参加する際の基本
初歩も初歩ですが、自分がつまずいたところを残します。
今のところの解き方としては、問題文を表示しつつ、paiza.ioの実行環境でテストしています。
🔽paiza.io
下のタブに「出力」「入力」タブがありますが、「入力」タブに値を打ち込んで「出力」タブに想定値が出るかどうか見ていきます。
問題を解く際の雛形は以下。
import sys
def main():
input = sys.stdin.readline
#処理を書く
if __name__ == "__main__":
main()
① if name == "main": とは?
Pythonの各ファイルには、自動で「name」という変数が用意されている。
そのファイルを python xxx.py と直接実行すると
→ name は "main" になる。
② def は関数
関数は飛ばして処理から実行されるので、 if name == "main": のブロックでmain()を読み出す形式になる
③ input = sys.stdin.readline とは?
入力値を受け取るための処理。
入力値を受け取る際、「input()」でも受け取れる。でもinput()だと大量入力が行われた時に遅くなってしまう。
sys.stdin.readline() は、文字列をそのまま一気に読むし、余計な処理が少ないため高速。
#042 A - 和風いろはちゃんイージー
与えられた三つの文字を並び替えると、575にできるかどうか判定する処理を考える。
いろんなやり方があるみたいだけど、入力値を配列で受け取って5が2つ、7が1つあればOKという処理で考えました。
import sys
def main():
input = sys.stdin.readline
a, b, c = map(int, input().split())
arr = [a, b, c]
if(arr.count(5) == 2 and arr.count(7) == 1):
print("YES")
else:
print("NO")
if __name__ == "__main__":
main()
ミスしたところ
はじめ入力値を配列で受け取る際以下のように書いていました。
❌ a, b, c = input().split()
するとYESの想定の入力値でもNOと出力されてしまった。
原因は文字列で受け取る文字列配列になっていたため、数値でカウントすることができませんでした。初歩すぎるミス。
intに変換して配列にいれることで正常に実行できました。
他解答
別解や解説を見たところ、配列をリストにしてソートするやり方が多かったです。
参考記事