見出し画像

[ABC271 Python]京セラプログラミングコンテスト2022(AtCoder Beginner Contest 271)A~C問題Python解説

ABC271の解説記事です。
ミス・質問等ありましたらコメントいただけると幸いです。

A問題

N = int(input())
print(format(N, "X").zfill(2))

この問題には2点ポイントがありました。
「10進数→16進数」「0埋め」です。

「16進表記に変換してください」と「先頭に0を加えることでちょうど2桁に」
という文言から上記の2つが必要だなと考えられます。

この2点は覚えてもいいのですが、
正直このような問題しか出ないので、このような問題が出たときに、
ネットで調べることをお勧めします。
今回私が参考にした資料は以下です。

進数について

0埋めについて

自分のわからないことを適切に調べることは、
簡単そうに見えて結構高度な技術なので、
そういったことも普段から練習しとくと、
プログラミングの技術も向上すると思います。

B問題

N, Q = map(int, input().split())
L = [list(map(int, input().split())) for _ in range(N)]

for i in range(Q):
    s, t = map(int, input().split())
    print(L[s-1][t])

B問題にしてはかなり基礎的な問題です。
この問題はA問題とは違ってほとんどの回で出てくる手法なので、
しっかりと覚える必要があります。

まずは、数列Lを受け取ります。
Lは2次元配列になっていて、
例えばL[1][0]とすれば、
L1項の0番目が取得できます。
(インデックス番号に注意)

次にQ個のクエリを受け取ります。
sとtが入力されるのですが、
問題文で言うと、
sはi、tはjに対応します。

sに関しては、iと完全に対応しているので、
そのまま指定して大丈夫(もちろんインデックス番号なので-1する)
のですが、
tに関しては、先頭にi番目を表すL_Nが入っているので、
それを除いて指定します。
(インデックス番号では-1したのち、L_Nの分+1します。結局+0)

最後に指定した要素を毎回出力します。

C問題

N = int(input())
a = list(set(map(int, input().split())))
a.sort()

count = N
index = 0
for i in range(1, N+1):
    if i == a[index]:
        count -= 1
        index += 1
    else:
        count -= 2
    if count < 0:
        print(i-1)
        exit()
    if index == len(a):
        print(len(a) + (N-len(a))//2)
        exit()

変数がいっぱいあって大変ですが、
スクリプトに沿って説明していきます。

まずは入力値を受け取ります。
すぬけ君が持っている冊数Nと、
もっている本の種類を表すリストaです。
この理由は後で説明しますが、リストaは種類数を表すset型にしてから、
取得します。

続いて用意する変数の説明です。
変数は全部で3つ、count,indexとforループ内のiです。
countは残りの漫画の数です。
読んだら-1されますし、売ったら‐2される感じです。
indexはその名のとおり、リストのどこにいるかを示します。
そして、iに次に読みたい漫画の番号を入れておきます。

では、実際に作業に移ります。
まず、iには1からNの数字が入りますので、
次に読みたい漫画iがaの要素と一致していれば、
それを読めばいいということになります。
この時に、
残りの漫画数countは今読んだので-1
indexは次に進むので、+1
します。

読みたい漫画iがaの要素と一致しなければ、
2冊売って、漫画iを買うという方法を取ります。
ここでは残りの漫画数を-2するだけで大丈夫です。

また、ここでの注意として、漫画数count<0つまり、
もう持っている漫画がない場合は次に読みたい漫画iは読むことができないので、i-1を出力して終了します。

さらに、index = len(a)
先程種類数で管理しましたが、同じ本がいくらあったところで、
1冊は実際に読み、残りはすべて売ることになるので、
種類を全て網羅できた場合はループを終了し、
種類数と2冊ごとに売ってゲットした漫画の合計を出力します。



この記事が気に入ったらサポートをしてみませんか?