ABC230の参加記録です。
Python3で参加のレート600台の私が、自分が理解した内容で振り返ります。
Python3のACコード付きです。
A – AtCoder Quiz 3
標準入出力と条件分岐、str型の取り扱いが出来るかが問われる問題。
入力値Nが与えられるので、42以上の場合は、1加算して、”AGCXXX”というように、開催数の部分は3桁にして出力してください。という問題です。
条件分岐に関しては、42以上の場合は、入力値を1つ増やせばOKですね。
回数の部分は、str型にして、zfill()
で引数に3を入れて3桁にしたらOKですね。
あとは、文字列の結合して、print()
したらACします。
# AtCoder Beginner Contest 230
#A - AtCoder Quiz 3
N=int(input())
# 42以上の場合は、開催数を +1 する
if N>=42:
N+=1
# str型にして.zfill(3)で0埋めで3桁にする
print("AGC"+str(N).zfill(3))
B – Triple Metre
部分文字列が含まれるかを判定する問題。
Sが与えられるので、”oxx”がたくさん続く文字列Tに、Sが含まれるかを判定する方法が聞かれています。
Python3では、文字列Tに部分文Sが含まれているかを以下のコードで判定可能です。
S = "a"
T = "abc"
print(S in T)
# => True
S = "z"
T = "abc"
print(S in T)
# => False
文字列Tの作成は、"oxx" * 10**5
で可能です。
そのほか、今回はSの長さが10以下という制約があるので、人力で適当な回数コピペで張り付けてTを作ってもOKですね。
私は、コンテスト中は、T = "oxx" * 100
として提出しました。
# AtCoder Beginner Contest 230
# B - Triple Metre
# 問題文に書かれている通りの作成
T = "oxx" * 10**5
# てきとーに"oxx"をコピペして作成
T = "oxxoxxoxxoxxoxxoxxoxxoxxoxxoxxoxxoxxoxxoxxoxxoxx"
# コンテスト中に提出したコード
T = "oxx" * 100
S = input()
if S in T:
print("Yes")
else:
print("No")
C – X drawing
二次元グリッドの斜めのマスを判定できるかが問われる問題。
この問題を理解するのにものすごく時間がかかりました。
まず、問題文にいろいろ書いてあって、苦労しますよね。。。
いろいろ書いていますが、重要なのは、次の部分です。
- ( A+k, B+k )を黒く塗る。
- ( A+k, B-k )を黒く塗る。
二次元グリッドをxy平面だと考えると、傾きが 1 と -1 の直線を描くことになるのですね。
この斜めの直線に関しては、下のような図を書くと、黒く塗られる箇所の条件を理解しやすかったです。

あとは、条件判定する範囲が決められているので、都度、PとRを足したり引いたりしながら判定していきました。
# AtCoder Beginner Contest 230
# C - X drawing
N, A, B = map(int,input().split())
P, Q, R, S = map(int,input().split())
area=[["." for c in range (S-R+1)] for r in range (Q-P+1)]
for r in range(Q-P+1):
for c in range (S-R+1):
# 確認する対象区間を[P,Q], [R,S]にするため加算する
# 戻すのを忘れないように注意する
r += P
c += R
if r >= A and c >= B: # 青
if r-c == A-B:
r -= P
c -= R
area[r][c] = "#"
else:
r -= P
c -= R
elif r >= A and c < B: # 紫
if r+c == A+B:
r -= P
c -= R
area[r][c] = "#"
else:
r -= P
c -= R
elif r < A and c >= B: # 赤
if A+B == c+r:
r -= P
c -= R
area[r][c] = "#"
else:
r -= P
c -= R
elif r < A and c < B: # 水色
if A-B == r-c:
r -= P
c -= R
area[r][c] = "#"
else:
r -= P
c -= R
else:
r -= P
c -= R
for line in area:
print("".join(line))
コメント