0
0

More than 1 year has passed since last update.

ABC249 B Dif:47 『AtCoder ABC226~250 ARC129~139 灰・茶・緑問題 超詳細解説』サンプル

Last updated at Posted at 2022-07-24

この記事は 『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)
0
0
0

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