리스트에서 특정 값 K가 N개 이상 연속해서 나타나는 구간을 찾아야 할 때가 있습니다. 이런 경우 파이썬의 내장 함수 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)으로, 대용량 데이터에서도 효율적으로 동작합니다.