(ABC285)A-C問題のpythonでの解法

abc285 AtCoder

こんにちは、こんぶちゃ(茶コーダー)です!

初心者視点から競プロAtCoderのABC285のA問題〜C問題の自身の解答と解答説明をしていきます。

こんな人にオススメしたい
  • 競技プログラミング初心者で、問題の解き方がわからない方
  • AtCoderの公式解説は読んだが、内容が理解できなかった方
  • Pythonでの解法を知りたい方

まだまだ学習の身ですので、最適コードではない部分も多々あるかと思いますが、その部分は同じ学習者として温かい気持ちで応援&ご助言頂けば嬉しいです。

では早速行ってみましょう!

今回使用している機能・アルゴリズム
  • 数字化(Unicode)           ・・・ 問題C

今回の参加コンテスト(ABC285)

AtCoder Beginner Contest 285

A問題:Edge Checker 2

A – Edge Checker 2

問題(要約)

a番の点とb番の点が直接結ばれているかを判断する。問題の図面は上記サイトを参考

解答

# 番号1
a,b=map(int,input().split())

# 番号2
if b//2==a:
    print("Yes")
else:
    print("No")

考え方 (下の番号は、コード内のコメント番号と連携している)

a<bの関係性が問題文で与えられているため、下記の条件を満たせばa点とb点が直接結ばれているか判断ができる

  • b割る2の商が、aと一致している (b//2 == 2)

以下、プログラム内容詳細

  1. 入力a, bを受け取り、整数型に変換する
  2. if文を用いて、上記の条件式に当てはまるかを確認し、当てはまれば”Yes”、そうでなければ、”No” を出力する

B問題:Longest Uncommon Prefix

B – Longest Uncommon Prefix

問題(要約)

英小文字からなる長さNの文字列Sにおいて以下の条件を満たす最大の非負正数 l を求める

  • l + I ≦ N
  • 全ての1 ≦ k ≦ l を満たす正数 k について、Sk ≠ Sk+i を満たす

*入力例1の出力例1を見ていただいたら想像がつくと思います(問題文が難しい)

解答

# 番号1
n=int(input())
S=input()

# 番号2
for i in range(1,n):
    # 番号2-1
    for j in range(n):
        if j+i < n:
            if S[j] == S[j+i]:
                print(j)
                break
        else:
            print(j)
            break

考え方(下の番号は、コード内のコメント番号と連携している)

for文でfor文をネスト(入れ子)構造にし、文字列が一致、配列外になっているかを確認する

  1. 入力 n, S を受け取る
  2. 外側のfor文のカウンタ変数を i として、何個置きのデータを比較するかを決める
    1. 内側のfor文で長さNの文字列Sを確認していく
      • 確認する配列 j+i が配列の長さを超えるかどうか確認する
        • j + i が配列内なら、文字同士を比較していく

C問題:abc285_brutmhyhiizp

abc285_brutmhyhiizp

問題(要約)

英大文字からなる文字列Sが問題番号を示しており、数字に変換して出力する

1問目から順、A, B,…, Z, AA, AB, …, ZZ, AAA, …. の順番である

解答

# 番号1
S=input()
ans=0

# 番号2
for i in range(len(S)):
    ans+=(ord(S[i])-64)*26**(len(S)-i-1)

# 番号3
print(ans)

考え方(下の番号は、コード内のコメント番号と連携している)

アルファベットは26文字あるため、26進数として考えて解く(順番には注意)

  1. 入力を受け取る。また、解答の数を保持するためのans変数を準備する
  2. 文字を一文字ずつ取り出す
    • ord()関数にて文字を数字化を行う。A:65のため、64で引くことにより調整
    • 左から1桁目が260, 2桁目が261となり、2進法などとは乗数の順番が反対になることに注意
  3. ansで足し合わせたものを出力する
  4. アイテムの位置は集合型で受け取る。空の辞書型itemsを宣言し、それぞれの位置を追加していく。
  5. 配列Sから文字列を順番に取り出す

感想

以前に解いた問題の復習でしたが、すっかり忘れてB問題に苦戦・・・。

そういう意味で、復習の甲斐がありましたー。

時間見つけて、過去問に戻って解答作っていこうと思います。

それでは、良い競プロライフを〜!

コメント

タイトルとURLをコピーしました