ABC218参戦記

プログラミング

今週はヒューリスティックコンテストのRECRUIT 日本橋ハーフマラソン 2021〜増刊号〜に参加していたり、他もいろいろと忙しくて、アルゴリズムの勉強は出来ていない中、参加したABC218の参加記録です。
使用言語はPython3のレートは茶色の私が、自分が理解した内容を書いていきます。
また、A問題からC問題までのACしたコードも載せています。

A – Weather Forecast

標準入出力と条件分岐、indexの理解が求められる問題。
問題文に書いてある、N は1-indexで書かれています。
Pythonなどプログラミング言語では0-indexで取り扱う考えることが多いので、配列にアクセスするときには、N-1する必要があります。

あとは、問題に書いてある条件分岐の通りにコードを書けばよいですね。

‘o'(オー)と’x'(エックス)であることに気を付けましょう。わかりづらいですが、’〇'(まる)と’×'(ばつ)ではないので注意しないとWAになってしまいます。

# AtCoder Beginner Contest 218
# A - Weather Forecast

N=int(input())
S=input()
a=S[N-1]
print("Yes") if a=="o" else print("No")

B – qwerty

繰り返し処理が使えるかが問われる問題。

私は、アルファベットをリストで用意して、Pの各要素は1-indexなので、0-indexでアルファベットのリストから取得して答えにしていく方法をとりました。

# AtCoder Beginner Contest 218
# B - qwerty

alphabet=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
P=list(map(int,input().split()))
ans=""
for e in P:
    ans+=alphabet[e-1]
print(ans)

プログラミングとしてはスマートな感じはしませんね。
Python3にも、アルファベットと数字の対応があるので、そちらを利用するとコードも短く、また、アルファベットの打ち間違いも減ります。

Python3で特定の文字を、何番目の文字か調べるのには、組み込み関数の ord() を利用すれば調べることが可能です。

print(ord('a'))
# => 97
print(ord('あ'))
# => 12354

つまり、Python3では、’a’ という文字は、97番目の文字として、’あ’という文字は、12354番目の文字として登録されているようです。

反対に、何番目の文字かを指定して文字を出力させることも可能で、こちらは、chr() を利用できます。

これらを利用して、この問題を解くことも可能です。入力は1-indexで数字が与えられます。
Pの要素で1をa、つまり97番目の文字として扱いたいため、Pの全ての要素において-1した値をchr() 関数の引数に渡してあげればよいわけですね。

あとは、map() を利用して、Pのリストの各要素をアルファベットに変換し、結合した文字列を出力したらOKです。

P=list(map(int,input().split()))
P=list(map(lambda x:chr(97+x-1),P))
print("".join(P))

C – Shapes

難しい問題。
私はコンテスト中解けませんでした。
方針はおおむねあっていたのですが、詰め切れませんでした。

私は、この問題を”.”を0に、”#”を1に変換した二次元配列として、1行目または1列目の合計が0なら削除して最終行または最終列に同じものを追加していき、図形を崩さず平行移動させました。
二次元配列はnumpyを利用しました。
90度回転はnp.rot90() を、二つの二次元ベクトルが同じかどうかの判定には、np.allclose()を利用しました。
ここまではコンテスト中に書けたのですが、Tを動かさずに判定しようとしてコンテスト中はAC出来ませんでした。
コンテスト後にTを左上まで移動させて判定すればよいことがわかり、少し書き直したらACしました。

# AtCoder Beginner Contest 218
# C - Shapes

import numpy as np

# 図形をを左上に寄せる
def f(figure, N):
    bar=np.array([0]*N)
    _bar=bar.reshape((N,1))

    for i in range (N):
        if np.sum(figure,axis=1)[0]==0:
            figure=np.delete(figure,0,0)
            figure=np.vstack((figure,bar))
        else:
            break

    for i in range (N):
        if np.sum(figure,axis=0)[0]==0:
            figure=np.delete(figure,0,1)
            figure=np.hstack((figure,_bar))
        else:
            break
    return figure


N=int(input())
S=[]
for i in range (N):
    l=input()
    l=l.replace(".","0").replace("#","1")
    l=list(map(int,l))
    S.append(l)
T=[]
for i in range(N):
    l=input()
    l=l.replace(".","0").replace("#","1")
    l=list(map(int,l))
    T.append(l)

f1=np.array(S)
f2=np.array(T)

# Tを左上に寄せる
t=f(f2,N)

# Sを回転させながら左上に寄せてTと一致するか確認
for i in range (4):
    f1=np.rot90(f1,i)
    s=f(f1,N)
    if np.allclose(s,t):
        print("Yes")
        exit()
print("No")

コメント

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