テービーテックのデータサイエンス

未経験リケジョがゼロからデータサイエンティストを目指す姿を記す奮闘記です。2019/12/05文系出身者が共同で更新を開始

TAG index

AtCoder-練習問題を解きまくる4

f:id:tbtech:20210825152435p:plain
今日もAtCoderの練習問題を解きまくるよ~(*´▽`)ノ

ABC057B - Checkpoints

f:id:tbtech:20210822224155p:plain
f:id:tbtech:20210822224620p:plain

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 - ∵∴∵

f:id:tbtech:20210822230244p:plain
f:id:tbtech:20210822230450p:plain

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

f:id:tbtech:20210822234737p:plain
f:id:tbtech:20210822235021p:plain

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

f:id:tbtech:20210823005401p:plain
f:id:tbtech:20210823005422p:plain

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

f:id:tbtech:20210825151712p:plain
f:id:tbtech:20210825151907p:plain

N, *a = map(int, open(0).read().split())
A=sorted(set(a))
print(A[-1]-A[0])

Nに家の個数と、aに各家の座標を格納します。
同じ座標に複数個家がある場合があるので、setで座標の固有値を出します。
それを昇順に並び替えます。最後に端同士の家の座標の差を出力します。


レベルBの問題にもだいぶ慣れてきました~
今後はレベルCの問題にも挑戦していきます(^^♪
つづく!