こんにちは、こんぶちゃ(茶コーダー)です!
初心者視点から競プロAtCoderのABC285のA問題〜C問題の自身の解答と解答説明をしていきます。
まだまだ学習の身ですので、最適コードではない部分も多々あるかと思いますが、その部分は同じ学習者として温かい気持ちで応援&ご助言頂けば嬉しいです。
では早速行ってみましょう!
今回の参加コンテスト(ABC285)
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)
以下、プログラム内容詳細
- 入力a, bを受け取り、整数型に変換する
- if文を用いて、上記の条件式に当てはまるかを確認し、当てはまれば”Yes”、そうでなければ、”No” を出力する
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文をネスト(入れ子)構造にし、文字列が一致、配列外になっているかを確認する
- 入力 n, S を受け取る
- 外側のfor文のカウンタ変数を i として、何個置きのデータを比較するかを決める
- 内側のfor文で長さNの文字列Sを確認していく
- 確認する配列 j+i が配列の長さを超えるかどうか確認する
- j + i が配列内なら、文字同士を比較していく
- 確認する配列 j+i が配列の長さを超えるかどうか確認する
- 内側のfor文で長さNの文字列Sを確認していく
C問題: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進数として考えて解く(順番には注意)
- 入力を受け取る。また、解答の数を保持するためのans変数を準備する
- 文字を一文字ずつ取り出す
- ord()関数にて文字を数字化を行う。A:65のため、64で引くことにより調整
- 左から1桁目が260, 2桁目が261となり、2進法などとは乗数の順番が反対になることに注意
- ansで足し合わせたものを出力する
- アイテムの位置は集合型で受け取る。空の辞書型itemsを宣言し、それぞれの位置を追加していく。
- 配列Sから文字列を順番に取り出す
感想
以前に解いた問題の復習でしたが、すっかり忘れてB問題に苦戦・・・。
そういう意味で、復習の甲斐がありましたー。
時間見つけて、過去問に戻って解答作っていこうと思います。
それでは、良い競プロライフを〜!
コメント