[파이썬] 그리디 알고리즘의 응용과 예제

그리디 알고리즘은 최적 부분 구조를 이용하여 문제를 해결하는 알고리즘입니다. 이 알고리즘은 각 단계에서 최적의 선택을 함으로써 전체적으로도 최적의 결과를 얻을 수 있습니다.

그리디 알고리즘의 응용은 다양한 문제에 활용될 수 있으며, 이를 통해 실제 예제를 풀어보겠습니다. 이번 예제에서는 순회 세일스맨 문제를 그리디 알고리즘을 사용하여 해결하는 방법을 살펴보겠습니다.

순회 세일스맨 문제

순회 세일스맨 문제는 도시를 모두 방문하면서 가장 짧은 경로를 찾는 문제입니다. 이 문제를 그리디 알고리즘을 사용하여 해결하면 다음과 같습니다.

입력

출력

def find_shortest_path(n, distances):
    current_city = 0  # 출발 도시를 0번 도시로 설정
    visited_cities = [current_city]  # 방문한 도시를 저장하는 배열
    while len(visited_cities) < n:  # 모든 도시를 방문할 때까지 반복
        next_city = -1  # 다음 방문할 도시
        min_distance = float('inf')  # 최단 거리를 무한대로 초기화
        for i in range(n):
            if i not in visited_cities:  # 방문하지 않은 도시일 경우
                if distances[current_city][i] < min_distance:  # 더 짧은 거리를 발견한 경우
                    next_city = i  # 다음 방문할 도시를 설정
                    min_distance = distances[current_city][i]  # 최단 거리 갱신
        visited_cities.append(next_city)  # 다음 도시를 방문한 도시 목록에 추가
        current_city = next_city  # 현재 도시를 다음 도시로 변경
    return visited_cities

# 예제 입력
n = 4  # 도시의 수
distances = [
    [0, 10, 15, 20],
    [10, 0, 35, 25],
    [15, 35, 0, 30],
    [20, 25, 30, 0]
]

# 함수 호출
shortest_path = find_shortest_path(n, distances)
print(shortest_path)  # [0, 1, 3, 2]

위의 코드에서는 현재 도시에서 방문하지 않은 도시 중에서 가장 가까운 도시를 선택하여 방문하는 것을 반복합니다. 이렇게 하면 모든 도시를 방문하면서 가장 짧은 경로를 구할 수 있습니다.

위 코드를 실행하면, 주어진 예제 입력에 대한 가장 짧은 경로인 [0, 1, 3, 2]가 출력됩니다.

이와 같이 그리디 알고리즘을 사용하여 순회 세일스맨 문제를 해결하는 방법을 살펴보았습니다. 그리디 알고리즘은 최적 부분 구조를 가지는 문제에 유용하게 적용될 수 있으며, 여러 가지 문제에 적용하여 최적의 결과를 얻을 수 있습니다.