はじめに
このシリーズではレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】でまとめられている100問をPythonで解いています。
問題
ポイント
全探索で解いていきます。
①1枚目の写真(探したい星座)の中で、最も左にある星を確認する。
②2枚目の写真(星空)の中にある星の中から1つ選び、この星が①で求めた星だと仮定した際の、
①と②の平行移動の距離を求める。
③ 1枚目の写真(探したい星座)の他の星に関して、それぞれ同じ平行移動を行った場所に2枚目の中で星が存在するかを確認する。星座を構成する星が全てあればOK, 1つでも無ければNGなので②で違う星を選ぶ。
コード
def main():
target_sign = []
stars = []
# 1枚目の写真(探したい星座)の取得
M = int(input())
for _ in range(M):
x, y = map(int, input().split(" "))
target_sign.append([x,y])
# 2枚目の写真(星空)の取得
N = int(input())
for _ in range(N):
x, y = map(int, input().split(" "))
stars.append([x,y])
# 左から並ぶ様にソートする
target_sign.sort(key=lambda x: x[0])
stars.sort(key=lambda x: x[0])
# 平行移動の距離を計算する(ポイントの①,②の部分)
for i in range(len(stars)):
distance_x = stars[i][0] - target_sign[0][0]
distance_y = stars[i][1] - target_sign[0][1]
# 他の星を平行移動した位置に星が存在するかを確認する(ポイントの③の部分)
for j in range(1, len(target_sign)):
tmp = [target_sign[j][0] + distance_x, target_sign[j][1] + distance_y]
if tmp not in stars:
break
else: # for loopがbreakしなければ平行移動した距離を出力
print(distance_x, distance_y)
if __name__ == '__main__':
main()