プログラミング初心者のkoheiと申します。Qiita初投稿です。
仕事で、少しずつPythonを使う機会が増えてきたため、本格的に勉強を開始しました。メインは、データサイエンスですが、AtCoderにはまってしまいました。
というわけで、9/18開催のAtCoderのABC219にて、コンテスト初挑戦です!
ABC 219A
X=int(input())
#if文で判定し、上のランクまでの点数を出力
if X>=0 and X<40:
print(40-X)
elif X>=40 and X<70:
print(70-X)
elif X>=70 and X<90:
print(90-X)
else:
print('expert')
A問題は、問題文そのままif文を記述するのみ。5分くらい。
ABC219B
#文字列をリストに入れる
S_list=[]
for i in range(3):
S_list.append(input())
T=input()
# Tを1つずつ左から取り出して、数字に対応する文字列を連結していく
answer='' #空の文字列
for i in T:
answer=answer+S_list[int(i)-1]
print(answer)
B問題は、Tの文字に対応する文字列を出力する問題。
文字列をリストに入れることで、if文を書かなくていいようにした。
10分くらい。
ABC219C
#新しいアルファベット順X
X=input()
X_list=[]
for i in X:
X_list.append(i)
#N人
N=int(input())
#N人の名簿リスト
name_list=[]
for i in range(N):
name_list.append(input())
#それぞれの文字列を、X_listのインデックスの番号に置き換える。
N_alp_index=[]#それぞれの名前を数字に変換した後の格納用リスト
for i in range(N):
name=name_list[i]#名前を格納
alp_index=[]#初期化
for s in name:
for j in range(26):
if s==X_list[j]:
alp_index.append(j)
break
else:
pass
N_alp_index.append(alp_index)
#数字に置き換えたもリストを並び替える。
sorted_list=sorted(N_alp_index)
#あとは数字をもとに戻して順番に出力する
for i in sorted_list:
string=''#初期化
for j in range(len(i)):
string+=X_list[i[j]] #数字をX_listの文字列に戻して、つなげて出力
print(string)
C問題。ここをとるのを今回の目標にしていた。
sorted()関数で、辞書順に並び替えることができるが、新しい辞書順Xにどう落とし込むのかがわからなかった。
よって、地道に文字列を新しい辞書順のインデックスとして格納してから、sorted()で並び替えて、元の文字に戻す方法をとった。
辞書順X: bacdefghijklmnopqrstuvwxzy
文字列1: abx→[1, 0, 23], 文字列2: bzz→[0, 24, 24]...以下同
これをリストに格納して、sorted()で並び変え
sorted([[1, 0, 23], [0, 24, 24] , ...])
→[[0,24, 24],[1, 0, 23]...]
で、数字をもとの文字列に戻して出力
時間はかかったが、もともとD問題以上は解けないというのがわかってたので、時間は十分にあった。無事、ACで、一安心。
Cまで完答できれば、茶色まではいけると思うので、次回も頑張りたい。
反省としては、やはりC問題。もう少しスッキリ書けそうな気がしたので、スマートな方法を調べてみた。
###方法: sorted()のkeyへの指定を工夫する方法
X=input()
N=int(input())
S=[input() for _ in range(N)]
t={}
for i in range(26):
t[X[i]]=chr(i+ord('a'))
print(*sorted(S, key=lambda s: ''.join(t[c] for c in s)), sep='\n')
コードが短すぎてレベルの差を痛感しました。
なんとなく、sorted()のkeyにlambda関数でうまく新しい辞書順を反映できれば、実現できるというのはわかっていましたが、まったくその方法がわからず、めちゃくちゃ長いコードを書いていました。
・ポイント
tに、新しい辞書順Xと、元のアルファベット順の辞書を作っています。
t={'b': 'a', 'a': 'b', 'c': 'c', 'd': 'd', 'e': 'e', 'f': 'f', 'g': 'g', 'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 'l': 'l', 'm': 'm', 'n': 'n', 'o': 'o', 'p': 'p', 'q': 'q', 'r': 'r', 's': 's', 't': 't', 'u': 'u', 'v': 'v', 'w': 'w', 'x': 'x', 'z': 'y', 'y': 'z'}
sorted(S, key=lambda s: ''.join(t[c] for c in s)
上記の部分で、tの辞書を基に、文字を置き換えてから、sortしています。
abx→ a:b, b:a, x:z →baz
bzz→ b:a, z:y, z:y →ayy
現実的には、上記のコードを今のレベルで実装するのは無理だったと思うので、長ったらしいコードでしたが、これでよかったと思います。何が何でもCをもぎ取るのです。
リスト内包表記や、lambda無名関数の使い方など、知識としてはわかっていても、実際に使えるレベルには至っていないので、上級者の方のいいコードを見てどんどん学んでいきます。
次週も頑張りたいと思います。過去問のB, Cを解きまくります!