코딩테스트

02 기초 수학과 구현 - 최장 맨해튼 거리

ynzify 2023. 9. 9. 14:31

최장 맨해튼 거리

 

맨해튼 거리(Manhattan Distance)는 각 좌표의 차를 모두 더한 것을 거리로 한다.
즉, |x1−x2|+|y1−y2|가 두 점 (x1,y1), (x2,y2) 사이의 맨해튼 거리이다.

두 개의 정수를 임의로 짝을 지어 좌표로 나타냈을 때, 최장 맨해튼 거리를 구해보자

 

 

맨해튼 거리 구현

# 맨해튼 거리 공식
>>> def manhattan_distance(pt1, pt2):
>>>   distance = 0
>>>   for i in range(len(pt1)):
>>>     distance += abs(pt1[i] - pt2[i])
>>>   return distance

# 2차원에서 임의의 두점 (순서대로 x,y축)
>>> print(manhattan_distance([5, 8], [3,6])

# x, y, z축 3의 차원에 점을 나타내고 싶다면 ([5, 4, 3], [1, 7, 9])

 

 

 

근데 이제 여기서 문제는 2차원의 최장 거리를 나타내야 한다는 것인데,

모든 경우의 수 (4!=24 가지)를 다 따져봐야 한다 -  완전탐색을 이용

 

(코드로 구현하느니 24개를 손으로 해보겠다)

 

 

 

 

 

완전 탐색을 이용한 해설

 

>>> S = list(map(int, input().split()))

# 값을 0으로 초기화
>>> ans = 0

>>> for a in S:
>>>     x1 = a
>>>     for b in S:
        # 수를 중복해서 사용하면 안 된다!
>>>         if a == b:
>>>             continue
>>>         y1 = b
>>>         for c in S:
>>>             if a == c or b == c:
>>>                 continue
>>>             for d in S:
>>>                 if a == d or b == d or c == d:
>>>                     continue
>>>                 y2 = d
                # 맨해튼 거리 계산
>>>                 dist = abs(x1 - x2) + abs(y1 - y2)
                # 가장 큰 값으로 정답 갱신
>>>                 ans = max(ans, dist)

>>> print(ans)

 

 

 

수학적 접근

 

 

ㅣx1 - x2ㅣ+ ㅣy1 - y2ㅣ에서 절댓값 기호를 제거하자 -> x1 + y1 - x2 - y2

(절댓값 안이 항상 양수라고 가정)

 

 

입력받은 4개의 정수를 크기 순으로 정렬한 후 순서대로 a, b, c, d라고 할때,

더해지는 값은 클수록 이득이고 빼야하는 값은 작을수록 이득

 

 

a <  b < c < d 이므로,

x1, y1는 c, d (큰 값)

x2, y2는 a, b (작은 값) 이 된다

 

 

 

이걸 시험보면서 어케 생각하냐

 

 

 

 

따라서 이렇게 간단하게 정리가 가능하다

 

 

>>> S = list(map(int, input().split()))
>>> S.sort()
>>> print(S[3] + S[2] - S[1] - S[0])