0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AtCoder ABC219 Pythonでコンテスト初挑戦!

Last updated at Posted at 2021-09-19

プログラミング初心者のkoheiと申します。Qiita初投稿です。
仕事で、少しずつPythonを使う機会が増えてきたため、本格的に勉強を開始しました。メインは、データサイエンスですが、AtCoderにはまってしまいました。

というわけで、9/18開催のAtCoderのABC219にて、コンテスト初挑戦です!

ABC 219A

ABC219A
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

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

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への指定を工夫する方法

ABC219C_@c-yanさんのコード
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を解きまくります!

0
0
2

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?