この記事は 『AtCoder ABC226~250 ARC129~139 灰・茶・緑問題 超詳細解説』 のサンプルです。
値段:300円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0B7G13QMS
【booth(pdf)】
https://sano192.booth.pm/items/4025713
ARC129~139の部分のみ抜粋した廉価版 もあります。
値段:200円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0B7G337YF
【booth(pdf)】
https://sano192.booth.pm/items/4025737
【サンプル一覧】
ABC228 A:https://qiita.com/sano192/private/f8f09ea769f2414a5733
ABC249 B:https://qiita.com/sano192/private/daf74d7c31bc698d33ce
ABC226 C:https://qiita.com/sano192/private/3aa26373ca6cfcb3ef0f
ABC246 D:https://qiita.com/sano192/private/a22aadde99945bfb01a8
「ものすごく丁寧でわかりやすいABC解説」シリーズをベースに【キーワード】【どう考える?】【別解】を追加し、【解説】と【実装のコツ】を分けることでよりわかりやすく、具体例や図もより豊富に全ての問題の解説を書き直しました!
さらにQiitaでは公開していないARC129~139の灰・茶・緑問題も解説しています!
緑を目指す灰・茶コーダーの方へおすすめ!
【キーワード】
なし
【どう考える?】
大文字、小文字の確認はisupperまたはislowerを使えば簡単。これらを知らなくても「python 大文字 判定」等で検索すればすぐに出てくる。
重複がないかはそれぞれの文字について二重ループで確認する。
【解説】
まず「大文字があるか」「小文字があるか」を1文字ずつ確認する。それぞれあればTrueとなるような変数を用意しておけばいい。
重複の有無確認については(i,k)=(0,1),(0,2),(0,3),...,(1,2),(1,3),...についてSのi文字目とk文字目が違う文字になっているかを確認する。
※Sの左端を0文字目、次を1文字目、...と呼ぶ。
【実装のコツ】
<for x in (文字列)>
for x in (文字列)と書くことで(文字列)の文字を1文字ずつ順にxへ格納しながら処理ができる。
便利な書き方なので是非覚えてほしい。
<isupper/islower>
(文字).isupper()
と書くことで(文字)が大文字かどうかを確認できる。大文字ならTrue、小文字ならFalseが返ってくる。
<二重ループ>
forの中にもう一つforを入れることを「二重ループ」という。競技プログラミングでは必須のテクニック。
具体的には以下のように書く。
# i=0~(N-1)
for i in range(N):
# k=(i+1)~(N-1)
for k in range(i+1,N):
こうすることで(i,k)は
(0,1)
(0,2)
(0,3)
...
(1,2)
(1,3)
(1,4)
…
(2,3)
(2,4)
...
(N-1,N-2)
という順番で格納され、処理ができる。
【提出】
# 入力の受け取り
S=input()
# 「大文字が存在するか?」を管理する変数
OmoziExist=False
# 「小文字が存在するか?」を管理する変数
KomoziExist=False
# x:Sの各文字
for x in S:
# xが大文字なら
if x.isupper()==True:
# 「大文字が存在するか?」をTrueに
OmoziExist=True
# そうでない場合(xが小文字)
else:
# 「小文字が存在するか?」をTrueに
KomoziExist=True
# 大文字が存在しない または 小文字が存在しないならば
if OmoziExist==False or KomoziExist==False:
# 「No」を出力
print("No")
# 途中終了
exit()
# Sの文字数
N=len(S)
# i=0~(N-1)
for i in range(N):
# k=(i+1)~(N-1)
for k in range(i+1,N):
# 重複⇔(Sのi文字目)=(Sのk文字目)
if S[i]==S[k]:
# 「No」を出力
print("No")
# 途中終了
exit()
# 「Yes」を出力
print("Yes")
【別解】
(文字列).isupper()は(文字列)が全て大文字の場合のみTrueを返す(islowerも同様)。
また、重複があるかは重複した要素が入らないsetに一文字ずつ入れ直し、元の文字と長さを比較することで確認可能。
# 入力の受け取り
S=input()
ans="Yes"
# Sが全て大文字または小文字なら「No」
if S.isupper() or S.islower():ans="No"
# Sをsetに展開した長さとSの文字数が一致していなければ「No」
if len(set(S))!=len(S):ans="No"
print(ans)