第48回【Python】二点間の距離 1、二点間の距離 2

現在取り組んでいるのは、paiza ラーニング問題集「配列メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 48 回目です。

野球ブログと化した昨今、Python の記事が滞っていますが、勉強は続けています。優先順位は野球が 1 位、それ以外が 2 位以下ですが、どんなに時間が厳しくても必ず勉強だけは必ずやります。

それでは、今日も頑張ってみようと思います。

二点間の距離 1

1 行目に整数 N が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。
点 (2, 3) と各点の距離を改行区切りで出力してください。

距離の計算にはマンハッタン距離

|x1 - x2| + |y1 - y2|

を用いることとします。


すべてのテストケースにおいて、以下の条件をみたします。

・* N は 1 以上 10 以下の整数
・* x_i, y_i (1 ≤ i ≤ N) は 1 以上 10 以下の整数


3
2 3
1 2
5 6

マンハッタン距離。うん、よく出る問題だ。マンハッタンって本当に正方形のブロックに区分されてるん?

Python
N = int(input())
X = [0] * N
Y = [0] * N
for i in range(N):
    x,y = map(int,input().split())
    X[i] = x
    Y[i] = y
for i in range(N):
    print(abs(X[i]-2) + abs(Y[i]-3))
VBA
Dim X() As Integer, Y() As Integer
N = Cells(1, 1)
ReDim X(N)
ReDim Y(N)
For i = 0 To N - 1
    XY = Split(Cells(i + 2, 1), " ")
    X(i) = Val(XY(0))
    Y(i) = Val(XY(1))
Next
For i = 0 To N - 1
    Debug.Print Abs(X(i) - 2) + Abs(Y(i) - 3)
Next

二点間の距離 2

1 行目に整数 N, A, B が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。
A 番目の点 と B 番目の点の距離を出力してください。


すべてのテストケースにおいて、以下の条件をみたします。

・* N は 1 以上 10 以下の整数
・* A, B は 1 以上 N 以下の整数
・* x_i, y_i (1 ≤ i ≤ N) は 1 以上 10 以下の整数


5
9 1 5 3 7

N が 1 以上 10 以下とのことで、10 個の座標が与えられたとしても、指定の 2 つの座標の距離を出力する、という少し無駄が多い問題。ただ、結構汎用性高いような気はする。

Python
N,A,B = map(int,input().split())
X = [0] * N
Y = [0] * N
for i in range(N):
    x,y = map(int,input().split())
    X[i] = x
    Y[i] = y
print(abs(X[A-1]-X[B-1])+abs(Y[A-1]-Y[B-1]))
VBA
Dim X() As Integer, Y() As Integer
NAB = Split(Cells(1, 1), " ")
N = Val(NAB(0))
A = Val(NAB(1))
B = Val(NAB(2))
ReDim X(N)
ReDim Y(N)
For i = 0 To N - 1
    XY = Split(Cells(i + 2, 1), " ")
    X(i) = Val(XY(0))
    Y(i) = Val(XY(1))
Next
Debug.Print Abs(X(A - 1) - X(B - 1)) + Abs(Y(A - 1) - Y(B - 1))

最後に

マンハッタン距離ってなんだろう。いや、わかっているんだけれど。

X、Y それぞれの配列を用意するのが正しいのか、辞書型とするのが正しいのか、タプル型とするのが正しいのか、今回の問題では、それぞれを用意するのがよさそうだったけれど。もっと大量の座標が用意された場合とか、いろいろなパターンで考えてみる必要がありそう?

引き続き、よろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki