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

Python – 리스트에서 K가 N개 이상 연속으로 나타나는 구간 찾기

리스트에서 특정 값 KN개 이상 연속해서 나타나는 구간을 찾아야 할 때가 있습니다. 이런 경우 파이썬의 내장 함수 enumerate()와 간단한 반복문을 활용하면 효율적으로 해결할 수 있습니다.

예제 코드

아래 예제는 리스트 안에서 65가 3회 이상 연속으로 등장하는 구간의 시작 인덱스와 끝 인덱스를 튜플 형태로 추출하는 방법을 보여줍니다.

my_list = [3, 65, 33, 23, 65, 65, 65, 65, 65, 65, 65, 3, 65]
print("The list is :")
print(my_list)
K = 65
N = 3
print("The value of K is ")
print(K)
print("The value of N is ")
print(N)
my_result = []
beg, end = 0, 0
previous = 1
for index, element in enumerate(my_list):
   if element == K:
      end = index
      if previous != K:
         beg = index
   else:
      if previous == K and end - beg + 1 >= N:
         my_result.append((beg, end))
   previous = element

print("The result is :")
print(my_result)

실행 결과

The list is :
[3, 65, 33, 23, 65, 65, 65, 65, 65, 65, 65, 3, 65]
The value of K is
65
The value of N is
3
The result is :
[(4, 10)]

코드 설명

  • 먼저 정수 리스트를 정의하고 콘솔에 출력합니다.

  • 찾고자 하는 값 K와 최소 연속 횟수 조건 N을 정의한 뒤 화면에 출력합니다.

  • 결과를 저장할 빈 리스트 my_result를 준비합니다.

  • 구간의 시작점(beg)과 끝점(end)을 담을 변수를 초기화합니다.

  • previous 변수에는 이전 요소의 값을 저장하여, 현재 요소와 비교해 연속 여부를 판단하는 데 사용합니다.

  • enumerate()로 리스트를 순회하면서 각 요소와 해당 인덱스를 함께 가져옵니다.

  • 현재 요소가 K와 같다면 end를 현재 인덱스로 갱신하고, 바로 앞 요소가 K가 아니었다면 새로운 구간이 시작되는 것이므로 beg도 현재 인덱스로 설정합니다.

  • 현재 요소가 K가 아니라면, 직전까지 K 구간이 진행 중이었는지 확인합니다. 만약 그렇고 구간 길이(end - beg + 1)가 N 이상이라면 시작·끝 인덱스 쌍을 결과 리스트에 추가합니다.

  • 매 반복마다 previous를 현재 요소 값으로 갱신하여 다음 순회에서 연속성을 판별할 수 있도록 합니다.

  • 모든 순회가 끝난 후 결과 리스트를 콘솔에 출력합니다.

참고 사항

위 예제에서 65는 인덱스 4부터 10까지 총 7번 연속으로 나타나므로, 조건(N ≥ 3)을 만족하는 구간 (4, 10) 하나만 결과로 반환됩니다. 마지막의 단일 65(인덱스 12)는 연속 횟수가 부족해 제외됩니다. 이 알고리즘은 리스트를 한 번만 순회하므로 시간 복잡도가 O(n)으로, 대용량 데이터에서도 효율적으로 동작합니다.