[ABC458] ABC 458(Atcoder Beginner Contest)のA~C(A,B,C)問題をPythonで解説(復習)
A問題
- スライスを使おう.
A.py
"""
<方針>
- スライスを使おう.
"""
# 入力
S = input()
N = int(input())
# スライス
ans = S[N:-N]
# 出力
print(ans)
B問題
- 単純に毎回計算してけば良くね?
B.py
"""
<方針>
- 単純に毎回計算してけば良くね?
"""
H, W = map(int, input().split())
XX = [[None]*W for _ in range(H)]
for y in range(H):
for x in range(W):
# 隣接する個数
cnt = 0
# 上下左右を確認
for dy, dx in [
[+0, +1],
[+0, -1],
[+1, +0],
[-1, +0],
]:
Y = y + dy
X = x + dx
if(0<=Y<H and 0<=X<W):
cnt += 1
# 記入
XX[y][x] = cnt
for X in XX:
print(*X)
C問題
方針
-
"C"という文字があったとき,そこから左右どちらかにぶつかるまでは文字列を取得できる. - したがって,
"C"を見つけるたびに,左右からの距離のうち,短い方を個数としてカウントしてけば良さそう.
前提
-
C問題あたりで,TLEになる人は,制約条件を見る癖をつけよう. -
AとB問題では,基本的に制約条件を見ずにやっても解ける. - しかし,
C問題以降では,制約条件を見ないと必ずTLEすると思っても良い. - 詳しい話は私の352回の記事 の
C問題の解説に記したので,是非参照してほしい.
C.py
"""
<方針>
- `"C"` という文字があったとき,そこから左右どちらかにぶつかるまでは文字列を取得できる.
- したがって,`"C"` を見つけるたびに,左右からの距離のうち,短い方を個数としてカウントしてけば良さそう.
"""
S = input()
N = len(S)
ans = 0
for i in range(N):
if(S[i] == "C"):
# 短い方を追加
ans += min(i+1, N-i)
print(ans)
補足
関係するリンク(参考文献など)
筆者について
- Atcoderアカウント
- 今回も不参加のため,成績なし.
- 解説で示したA問題の提出
- 解説で示したB問題の提出
- 解説で示したC問題の提出
その他
- 間違いを含んでいる可能性があります.
- 方針と言いつつ,方針ではない感想などを書いている可能性があります.
- A問題から解説がだんだん省略されます.
- コードに書かれている解説の文言と,その上に書いてある解説の文言を変えている場合があります.
最後に一言
- ウェブ技術をハッキングぽく学べるサイトを作りました.よければプレーして.