ABC230参戦記

プログラミング

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))

コメント

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