개발머해니

[파이썬] 가장 가까운 매장 찾기 - 브루트 포스 ★ 본문

알고리즘

[파이썬] 가장 가까운 매장 찾기 - 브루트 포스 ★

왕행님 2023. 9. 16. 20:05
728x90
반응형

실습 설명

스다벅스는 줄어든 매출 때문에 지점 하나를 닫아야 하는 위기에 처해 있습니다. 어떤 지점을 닫는 게 회사에 타격이 적을지 고민이 되는데요. 서로 가까이 붙어 있는 매장이 있으면, 그 중 하나는 없어져도 괜찮지 않을까 싶습니다.

사장님은 비서 태호에게, 직선 거리가 가장 가까운 두 매장을 찾아서 보고하라는 임무를 주셨습니다.

태호는 영업팀에서 매장들 좌표 위치를 튜플 리스트로 받아 왔습니다.

# 예시 tuple 리스트
test_coordinates = [(2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)]


 좌표로 나타낸 것입니다. 0번 매장은 (2, 3)에, 그리고 1번 매장은 (12, 30) 위치에 있는 거죠.

태호가 사용하려는 함수 closest_pair는 이 좌표 리스트를 파라미터로 받고, 리스트 안에서 가장 가까운 두 매장을 [(x1, y1), (x2, y2)] 형식으로 리턴합니다.

참고로 태호는 이미 두 좌표 사이의 거리를 계산해 주는 함수 distance를 써 놨는데요, 함수 distance는 인풋으로 두 튜플을 받아서 그 사이의 직선 거리를 리턴합니다. 

print(distance((2, 5), (5, 9))) # => 두 지점 사이의 거리 5.0이 출력됨

 

실습 결과

# 제곱근 사용을 위한 sqrt 함수
from math import sqrt

# 두 매장의 직선 거리를 계산해 주는 함수
def distance(store1, store2):
    return sqrt((store1[0] - store2[0]) ** 2 + (store1[1] - store2[1]) ** 2)

# 가장 가까운 두 매장을 찾아주는 함수
def closest_pair(coordinates):
    # 여기에 코드를 작성하세요
    pair = [ coordinates[0] , coordinates[1] ]
    
    for i in range(len(coordinates) - 1):
        for j in range(i+1, len(coordinates)):
            store1, store2 = coordinates[i], coordinates[j]
            
            if distance(pair[0], pair[1]) > distance(store1, store2):
                pair = [store1, store2]
            
    return pair
    

# 테스트 코드
test_coordinates = [(2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)]
print(closest_pair(test_coordinates))
[(2, 3), (3, 4)]

 

 

오답 1

  • 튜플 선언 : [ a, b ]
  • for문으로 모든 조합 구하는 방법
# 제곱근 사용을 위한 sqrt 함수
from math import sqrt

# 두 매장의 직선 거리를 계산해 주는 함수
def distance(store1, store2):
    return sqrt((store1[0] - store2[0]) ** 2 + (store1[1] - store2[1]) ** 2)

# 가장 가까운 두 매장을 찾아주는 함수
def closest_pair(coordinates):
    # 여기에 코드를 작성하세요
    min_dist = distance(coordinates[0], coordinates[1])
    min_tuple = coordinates[0], coordinates[1]
    
    for i in coordinates:
        for j in coordinates:
            if i == j:
                continue 
            else:
                if min_dist > min(min_dist, distance(i, j)):
                    min_tuple = [i, j] #튜플 선언은 []
                    min_dist =  min(min_dist, distance(i, j))
            
    return min_tuple
    

# 테스트 코드
test_coordinates = [(2, 3), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)]
print(closest_pair(test_coordinates))
728x90
반응형