Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 모든 도시와 가장 가까운 역 사이의 최대 거리 구하기

```html

N개의 도시가 있으며, 각 도시는 0부터 N-1까지 번호가 매겨져 있다고 가정해 보겠습니다. 또한 역이 설치된 도시들의 목록도 함께 주어집니다. 우리가 구해야 하는 값은 임의의 도시에서 가장 가까운 역까지의 거리 중 최대값입니다. 이때 역이 있는 도시들은 순서에 상관없이 주어질 수 있다는 점에 유의해야 합니다.

예를 들어 입력이 N = 6이고 stations = [2, 4]라면 출력은 2가 됩니다. 도시 0에서 가장 가까운 역(2번)까지의 거리가 2로, 모든 도시 중 가장 먼 거리이기 때문입니다.

문제 해결 접근 방법

이 문제는 선형 탐색 한 번으로 해결할 수 있습니다. 알고리즘의 핵심 아이디어는 다음과 같습니다.

  • 첫 번째 역 이전의 도시들은 첫 역까지의 거리가 곧 최대 후보가 되므로, 초기 maximum_dist는 station의 최솟값으로 설정합니다.
  • 역과 역 사이에 연속된 dist개의 역 없는 도시가 있을 때, 그 구간에서 가장 가까운 역까지의 거리는 양쪽 끝 역 기준 (dist + 1) // 2가 됩니다.
  • 마지막 역 이후 남은 dist 값도 최종 결과와 비교하여 더 큰 값을 반환합니다.

구체적인 해결 단계는 다음과 같습니다.

  • station_present := 크기가 N인 리스트를 생성하고 False로 채웁니다.
  • station의 각 도시에 대해 station_present[city] := True로 설정합니다.
  • dist := 0, maximum_dist := station의 최솟값으로 초기화합니다.
  • 0부터 N-1까지 각 도시를 순회하며 다음을 수행합니다.
    • station_present[city]가 True이면 maximum_dist := max((dist + 1) // 2, maximum_dist)로 갱신하고, dist := 0으로 초기화합니다.
    • 그렇지 않으면 dist := dist + 1을 수행합니다.
  • 최종적으로 maximum_dist와 dist 중 더 큰 값을 반환합니다.

Python 구현 예제

더 나은 이해를 위해 다음 구현 코드를 살펴보겠습니다.

def get_max_dist(N, station):
    station_present = [False] * N
    for city in station:
        station_present[city] = True
    dist, maximum_dist = 0, min(station)
    for city in range(N):
        if station_present[city] == True:
            maximum_dist = max((dist + 1) // 2, maximum_dist)
            dist = 0
        else:
            dist += 1
    return max(maximum_dist, dist)

N = 6
station = [2, 4]
print(get_max_dist(N, station))

입력

6, [2,4]

출력

2

동작 과정 살펴보기

위 예제에서 도시 0~5가 있고 역은 2번과 4번에 위치합니다. 도시 0은 2번 역까지 거리가 2이고, 도시 1은 거리 1, 도시 3은 양쪽 역 모두 거리 1, 도시 5는 4번 역까지 거리 1입니다. 따라서 전체 최대 거리는 2가 됩니다.

이 알고리즘은 도시 배열을 한 번만 순회하므로 시간 복잡도는 O(N), 역 유무를 저장하는 리스트 때문에 공간 복잡도 역시 O(N)입니다. 역이 많거나 도시 수가 많은 경우에도 효율적으로 동작합니다.