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

Python으로 원형 트랙에서 가장 많이 방문한 섹터 찾기


문제 개요

숫자 n과 배열 rounds가 주어진다고 가정해 보겠습니다. 우리에게는 1부터 n까지 번호가 매겨진 n개의 서로 다른 섹터로 이루어진 원형 트랙이 있습니다. 이 트랙 위에서 경주가 열리며, 경주는 총 m개의 라운드로 구성됩니다. i번째 라운드는 rounds[i-1]번 섹터에서 출발하여 rounds[i]번 섹터에서 종료됩니다. 예를 들어 첫 번째 라운드는 rounds[0]에서 시작해 rounds[1]에서 끝납니다.

트랙의 번호는 반시계 방향으로 섹터 번호가 오름차순으로 증가하며, 우리의 목표는 경주 중 가장 많이 방문된 섹터를 찾아 오름차순으로 정렬해 반환하는 것입니다.

예시로 이해하기

입력이 n = 4, rounds = [1, 3, 1, 2]라고 해봅시다. 이때 출력은 [1, 2]가 됩니다.

Python으로 원형 트랙에서 가장 많이 방문한 섹터 찾기

경주는 1번 섹터에서 시작합니다. 방문되는 섹터의 순서는 다음과 같습니다.

[1, 2, 3(첫 번째 라운드 종료), 4, 1(두 번째 라운드 종료), 2(세 번째 라운드 종료)]

여기서 1번과 2번 섹터는 두 번씩 방문되어 가장 많이 방문된 섹터가 되고, 3번과 4번 섹터는 한 번만 방문됩니다.

해결 접근 방법

이 문제는 각 섹터의 방문 횟수를 누적해 기록한 뒤, 최대 방문 횟수를 가진 섹터들을 추출하는 방식으로 해결할 수 있습니다. 단계별 과정은 다음과 같습니다.

  • 각 섹터의 방문 횟수를 저장할 딕셔너리 d를 생성하고, 1부터 n까지 모든 섹터의 값을 0으로 초기화합니다.
  • 출발 섹터인 rounds[0]의 방문 횟수를 1로 설정합니다.
  • 각 라운드 구간을 순회하며 방문 횟수를 누적합니다.
    • rounds[i] > rounds[i-1]인 경우(같은 바퀴 안에서 이동): rounds[i-1]+1부터 rounds[i]까지의 섹터 방문 횟수를 1씩 증가시킵니다.
    • 그렇지 않은 경우(바퀴를 넘어가는 이동): rounds[i-1]+1부터 n까지, 그리고 1부터 rounds[i]까지의 섹터 방문 횟수를 각각 1씩 증가시킵니다.
  • 최대 방문 횟수 curr와 결과 리스트 out을 출발 섹터 기준으로 초기화합니다.
  • 1부터 n까지 모든 섹터를 확인하면서, 방문 횟수가 현재 최댓값보다 크면 최댓값과 결과를 갱신하고, 횟수가 같으면 해당 섹터를 결과에 추가합니다.
  • 마지막으로 out을 오름차순으로 정렬해 반환합니다.

Python 구현 예제

다음 구현을 통해 더 잘 이해할 수 있습니다.

def solve(n, rounds):
    d = {}
    for j in range(1, n+1):
        d[j] = 0
    d[rounds[0]] = 1
    for i in range(1, len(rounds)):
        if rounds[i] > rounds[i-1]:
            for j in range(rounds[i-1]+1, rounds[i]+1):
                d[j] += 1
        else:
            for j in range(rounds[i-1]+1, n+1):
                d[j] += 1
            for j in range(1, rounds[i]+1):
                d[j] += 1

    curr = d[rounds[0]]
    out = [rounds[0]]
    for i in range(1, n+1):
        if i != rounds[0]:
            if d[i] > curr:
                curr = d[i]
                out = [i]
            elif d[i] == curr:
                out = out + [i]
    return(sorted(out))

n = 4
rounds = [1, 3, 1, 2]
print(solve(n, rounds))

입력

4, [1,3,1,2]

출력

[1, 2]

복잡도 분석

시간 복잡도는 각 라운드마다 실제로 이동한 구간의 길이만큼 순회하므로, 최악의 경우 O(n × m)입니다. 공간 복잡도는 섹터 개수에 비례하여 O(n)입니다. 입력 크기가 작거나 중간 수준일 때 충분히 효율적으로 동작하는 직관적인 시뮬레이션 기반 풀이입니다.