今日もAtCoderの練習問題を解きまくるよ~(*´▽`)ノ
ABC057B - Checkpoints
n,m=map(int,input().split()) s = [list(map(int, input().split())) for _ in range(n)] c = [list(map(int, input().split())) for _ in range(m)] for stu in s: s_c=[] for che in c: s_c.append(abs(stu[0]-che[0]) + abs(stu[1]-che[1])) print(s_c.index(min(s_c))+1)
まず学生の数Nとチェックポイントの数Mをn,mへ格納します。
次に各学生の座標をsへリストで入れ、同様にcへチェックポイントの座標を入れます。
一つ目のforでsから学生の座標を一つずつ取り出し、stuへ入れます。
次のforではcから各チェックポイントの座標を取り出し、cheへ入れます。
(abs(stu[0]-che[0])は学生とチェックポイントのx方向の距離を、abs(stu[1]-che[1])は
y方向の距離を計算し、合計(マンハッタン距離)をs_cへ追加します。
全てのチェックポイントとの距離をs_cへ入れ終わったら、その中の一番小さい値の
チェックポイントのindexに+1したものを出力します。
これを全ての学生分繰り返し出力して終了します。
ABC058B - ∵∴∵
import itertools O,E=open(0).read().split() s=[] for o, e in itertools.zip_longest(O, E, fillvalue=''): s.append(o) s.append(e) print(''.join(s))
今回はitertoolsというライブラリを使うのでインポートしておきます。
Oに奇数番目の文字、Eに偶数番目の文字を入れます。
今回注意する点は、OがEより文字が多い場合があることです。
もしパスワードが11文字ならOは6文字、Eは5文字になります。
通常長さの違うリストを一緒に処理すると、短いリストの数に揃えられてしまいますが、
今回は文字数が違っても処理できるようにitertools.zip_longestを使います。
fillvalue=''で足りない文字数を他の文字に補完できます。今回は何も無しにします。
あとはOとEから順に文字を一つずつ取り出し空のリストSへ入れていきます。
最後にリストsの中身をつなげて文字列として出力します。
ABC061B - Counting Roads
N,M, *roads = map(int, open(0).read().split()) for i in range(1,N+1): print(roads.count(i))
Nへ都市の数、Mへ道路の数を入れ、roadsにどの都市同士に道路がつながっているかの値を入れます。
各都市から伸びている道路の数を知るためには、roadsに何回都市の番号が出てきたか数えれば分かります。
なのでroads.count(i)(iは都市の番号)で出てきた数を数えて出力します。
ABC063B - Varied
S = input() if len(set(S)) == len(S): print('yes') else: print('no')
与えられた文字列をSへ格納します。
len(set(S))はsetでSを重複した文字の無い状態にして、lenでその文字数を出します。
その文字数がもしSの文字数と同じであれば、元々Sは重複がない(含まれる文字がすべて異なる)
ことになるのでyesと出力し、そうでなければnoと出力します。
ABC064B - Traveling AtCoDeer Problem
N, *a = map(int, open(0).read().split()) A=sorted(set(a)) print(A[-1]-A[0])
Nに家の個数と、aに各家の座標を格納します。
同じ座標に複数個家がある場合があるので、setで座標の固有値を出します。
それを昇順に並び替えます。最後に端同士の家の座標の差を出力します。
レベルBの問題にもだいぶ慣れてきました~
今後はレベルCの問題にも挑戦していきます(^^♪
つづく!