LoginSignup
2
1

More than 3 years have passed since last update.

Atcoder のA問題をn=20問といてみた

Last updated at Posted at 2019-08-03

概要

AtcoderのA問題をひたすらといた

きっかけ

話題になっていたリリアンさんのブログを読んで

AtCoder500問を解くぐらいは自分でもできそうと思ったので流石にあのようには慣れないけどそれぐらいはやってみようと思いました。

目的

  1. 読解力をつける(問題の読み間違いを減らす、早く読めるようにする)
  2. 出力を合わせる(形式になれる、Yes,YESの違いとかに気づく)
  3. Master(テンプレ)を作る(入出力、よくつかう関数で)
  4. A問題を解く上で何が必要かをしる :AtCoderの問題を分類しましたの記事のように簡単に分類できると良い

環境

$ python --version
Python 3.6.8 :: Anaconda, Inc.

で行いました、

結果

abc002_a 数字の入力、簡単な演算:2つの大きい方を出力 4min

最初、文字列でx,y=input().split()受け取っていて、WAを出した。悲しい。1週間ほどやらなかっただけで忘れていて悲しい。(2回目)

abc002_a.py
x,y=map(int,input().split())
print(max(x,y))

abc003.py 等差数列の和 9min

abc003.py
n=int(input())
#print 10000*n(n+1)/2
print(int(10000*n*(n+1)/2/n))

abc004.py 2min

入力を2倍して出力

abc004.py
n=int(input())
print(n*2)

abc005_a.py y//xを出力 4min

abc006_a.py 簡単なif文 n%3==0 ならYES,other NO 1min

abc006_a.py
n=int(input())
if n%3 == 0:
    print("YES")
else:
    print("NO")

abc007_a.py print(n-1) 3min

abc008_a print(y-x+1) 2min

abc_a009 print((n+1)//2) 3min

abc010_a 文字列問題登場! 末尾にppをつける 3min

print(input()+"pp") 

abc011_a 次の月(1月の次は2月)を出力 7min

1行で書こうと思って、print(((int(input())+1))%12)と書いてWAを出した。悲しい。11月の時の対処。。。

abc011_a.py
n=int(input())
if n==12:
    print(1)
else:
    print(n+1)

abc12_a.py 2つの入力をswapする 4min

tmpをおかずに交換して初めてだと間違えるやつですね。

tmp置くとめんどくさいのでpythonで簡単にかけないかなーとググりました。a,b=b,a でOK
https://www.haya-programming.com/entry/2018/09/19/195828
を参考にしました。

結局出力の時に逆にするだけでいいので今回は使わなかったですが、タプル便利ですね。

abc012_a.py
x,y=map(int,input().split())
print(y,x)

abc13_a.py 大文字一文字を受け取ってAから何番めかを出力 7min

if文書いてもよかったのですが、めんどくさいのでpythonで文字をASCIIに変換する方法をググりました。
ord("A")でいけるみたいです。以下python3.6での結果

>>> ord("A")
65
>>> ord("D")
68
>>> ord("a")
97
>>> ord("1")
49

参考 https://python.civic-apps.com/char-ord/

a.py
print(ord(input())-ord("A")+1)

abc_a014.py a以上の最小のbの倍数とaとの差を出力する 10min

問題文が長くてきつかったです。
a以上の最小のbの倍数出力していたので2回WAを出しました。

abc014_a.py
a = int(input())
b = int(input())
if a%b ==0:
    print(0)
else:
    print((a//b)*b+b-a)

abc015_a.py 2つの文字列の長さを比較する。 6min

数字ばかりでマンネリ化してきていたので嬉しいです。len()を使います。

abc015_a.py
a =input()
b =input() 
if len(a) <= len(b):
    print(b)
else:
    print(a)

abc016_a.py xがyで割り切れればYES,それ以外はNO 7min

どっちをどっちで割るのかこんがらがった。日本語むずい。
python条件演算で1行でかけるのね。すごい

参考 http://www.tohoho-web.com/python/operators.html

a.py
x,y=map(int,input().split())
print("YES" if x%y==0 else "NO")

abc017_a.py 3つの掛け算の和 6min

入力がだんだんややこしくなってくる。
初めてpythonのリストを使った。

abc017_a.py
a = [0]*3
b = [0]*3
sum = 0
for i in range(3):
    a[i],b[i] = map(int,input().split())
    sum += a[i]*b[i]//10
print(sum)

ちなみにPypy3で最短のコードの人は
print(sum(eval(input().replace(' ','*'))for _ in[0]*3)//10)
と書いてて感動した。

abc018_a.py 3つの数の順位  27min

僕の頭の弱さを見せてめちゃ時間がかかった。。

a.py
s = [int(input()) for i in range(3)]
#print(max(max(s[1],s[2]),s[0]))
s_ =sorted(s, reverse=True) 
for i in range(len(s)):
    for j in range(len(s_)):
        if s[i] == s_[j]:
            print(j+1)

複数行の入力が増えてきたのでpythonでどうするか調べてみた。

https://qiita.com/yasu_teco/items/e8db933ac4f647166996 
を見るとリスト内包表記で1行にするぐらいしかないのかな?

リストの操作について復習した。s.sort()は破壊的(元のリストが変更される)、t=sorted(s)はtにソートされたリストが代入される。

参考 https://note.nkmk.me/python-list-sort-sorted/

for 文を書いているうちに頭がこんがらがった。悲しい。

テストケースは通ったのにWA出てなんで?と思ったら、intに変換してなかった。

最短の人のコードを見ると、
https://atcoder.jp/contests/abc018/submissions/3105593
sorted(a).index(x)でインデックスがみれるらしい。そんなの知らない。。

色々と学ぶことが多かったですが、もう2度とこんなに時間をかけたくないです。はい。

abc019_a.py 3つの数字の中央値を出力 12min

sortして[1]を出力すれば良い。
リストにするにはどうやったらいいんだっけ??ってなって時間を食った。
list(map())でリストに変換できます。

a.py
a=list(map(int,input().split()))
a.sort()
print(a[1])

abc020_a.py 入力を元に条件分岐 5min

せっかくなので、abc016で学んだ条件演算を使います。
短くかけました。

a.py
print("ABC" if input()=="1" else "chokudai")

abc021_a.py 和がnになる組み合わせ 7min

n回 1を出力すれば良さそう
問題文ちゃんと読みましょう。辛い。

a.py
n=int(input())
print(n)
for i in range(n):
    print(1)

abc022_a.py リストのk個までの和のうちs以上t以下である数を数える 

sumの使い方を学習した。sum(list)でlistの要素を全て足してくれる
リストとスライス [a:b:c]でaが開始点、bが終わり(bを含まない、bの直前まで),cがステップ幅(次に何個目に飛ぶか)デフォ1)

>>> a=[1,2,3]
>>> sum(a)
6
>>> sum(a[:2])
3
>>> sum(a[:0])
0
>>> sum(a[1:])
5
>>> b=[1,2,3,4,5,6,7]
>>> b[::2]
[1, 3, 5, 7]

なぜかデバッグで手間取ってACできないまま中断。あとで続き書きます。

学び

eval で文字列を式としてを評価することができるよ。
sorted(a).index(x) でソート後の値のindexを取れるよ。

注意する点

数字は忘れずにintに変換しよう
問題文は理解したと思ってももう一回読もう。(本当に)

2
1
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
2
1