はじめに
こんにちは、ひろとです。なんちゃって解説シリーズ第2回でございます。前回の記事はこちらから。注意点なども第1回の記事にありますのでまだ読んでない方はぜひお読み下さい。また、今回のC問題が時間内に解けていないので後日追加します。ただ数学のテストとかがあるのですこーし遅れるかもです。来週の週末目標でやります。
ABC252
今回のAB問題は解きやすい問題でした。A問題は連想配列を使うか言語に用意されている関数を使うことになると思います。B問題はsetを使うか普通に値を比較していけば解くことができました。
A問題 - ASCII Code
問題リンク: A - ASCII Code
制約
- $ N $は90以上122以下の整数
入力
$ N $
出力
答えを出力
考察
Pythonの場合はchr()
でASCIIコードと文字列を変換できるので、そのまま実装します。これを使いたくない場合は連想配列を使うと解くことができます。
ちなみに「ASCII」は「アスキー」と発音します。
回答コード
クリックして展開
n = int(input())
print(chr(n))
n = int(input())
chr = {
97: 'a',
98: 'b',
99: 'c',
...
120: 'X',
121: 'Y',
122: 'Z',
}
print(chr[n])
B問題 - Takahashi's Failure
問題リンク: B - Takahashi's Failure
制約
- $ 1 \leq N \leq N \leq 100 $
- $ 1 \leq A_i \leq 100 $
- $ 1 \leq B_i \leq N $
入力
$ N \quad K $
$ A_1 \quad A_2 \quad \cdots \quad A_N $
$ B_1 \quad B_2 \quad \cdots \quad B_K $
出力
高橋君が嫌いな食品を食べる可能性があるならばYes
を、無いならばNo
を出力せよ。
考察
max()
で求めた$ A $の中の最大値を$ M $とした時、$ A $に$ M $と同じ値が複数個含まれている可能性があります。そのため、index()
を使って$ A $内での$ M $のインデックスを取得する方法は取れません。実はindex()
だと一番最初に出てくる要素のインデックスしか取得することができないため、内包表記でインデックス+1の値を取得し配列$ l $に代入しています。enumerate()
を使うとインデックス(n
)と値(v
)を取得できるので結構便利です。あとは事前にsetにしておいた$ B $を使って存在確認を行えばOKです。
ここで、インデックスの値の扱い方に関して注意が必要です。問題で与えられる数は「◯番目」で一番最初の要素は1番目
、配列の一番最初の要素のインデックスは0
から始まります。そのため、$ l $に代入する時点で+1
してあげると後の実装がすこーーーーーしだけ綺麗になります。
またこの解法で解く場合は$ B $をset()
し忘れたら確実にTLEで詰みます。おそらくこの解き方は少数派だと思われるので公式の解説へのリンクを以下に貼っておきます。
B - Takahashi's Failure 解説 by mechanicalpenciI
回答コード
クリックして展開
n, k = map(int, input().split())
a = list(map(int, input().split()))
b = set(map(int, input().split()))
m = max(a)
l = [n + 1 for n, v in enumerate(a) if v == m]
for i in l:
if i in b:
print('Yes')
exit()
print('No')
C問題 - Slot Strategy
解き直し終わったら書きます🙏