이 글에서는 리스트가 완전히 비워질 때까지 매번 세 번째 요소를 제거하고 그 값을 출력하는 파이썬 프로그램을 다룹니다. 먼저 리스트를 생성하는데, 리스트의 인덱스는 0부터 시작하므로 첫 번째 세 번째 요소는 위치 2에 있습니다. 핵심은 리스트가 빌 때까지 순회하면서 매번 다음 세 번째 요소의 인덱스를 계산하고, 해당 값을 출력한 뒤 리스트의 길이를 하나씩 줄여나가는 것입니다.
참고로 이 문제는 원형으로 배치된 대상 중 매번 k번째를 제거해 나가는 유명한 '요세푸스 문제(Josephus Problem)'에서 k=3인 경우와 동일한 방식으로 해결할 수 있습니다.
예시
A:[10,20,30,40] 출력 결과: 30 20 40 10
설명
첫 번째 세 번째 요소는 30입니다. 그다음에는 제거된 지점의 다음 요소인 40부터 다시 세어 두 번째로 제거할 요소 20을 찾습니다. 이어서 다시 40부터 셋 때 세 번째가 되는 요소는 40 자신이며, 마지막으로 10이 출력됩니다.
알고리즘
1단계: 리스트의 인덱스는 0부터 시작하며, 첫 번째 세 번째 요소는 위치 2에 있습니다.
변수 p = 2, 시작 인덱스 id = 0
2단계: 리스트의 길이를 구합니다.
listlen = len(LST) // 리스트(LST)의 길이
3단계: 리스트가 비워질 때까지 반복하면서 매번 다음 세 번째 요소의 인덱스를 찾습니다.
While(listlen > 0) Id = (p + id) % listlen A = LST.pop(id) // 해당 요소를 제거하고 출력 Listlen -= 1 End while
여기서 핵심 식은 (p + id) % listlen입니다. 현재 인덱스에 간격 p를 더한 뒤 남은 리스트 길이로 나눈 나머지를 구하면, 리스트 끝에 도달했을 때 다시 처음으로 돌아가는 원형 순회를 간단하게 구현할 수 있습니다.
예제 코드
# 리스트가 빌 때까지 매번 세 번째 요소를 제거하는 함수
def removenumber(no):
# 리스트 인덱스는 0부터 시작하므로
# 첫 간격은 3 - 1 = 2
p = 3 - 1
id = 0
lenoflist = len(no)
# 리스트가 비면 반복 종료
while lenoflist > 0:
id = (p + id) % lenoflist
# 해당 요소를 제거하면서 출력
print(no.pop(id))
lenoflist -= 1
# 드라이버 코드
A = list()
n = int(input("Enter the size of the array ::"))
print("Enter the INTEGER number")
for i in range(int(n)):
p = int(input("n="))
A.append(int(p))
print("After remove third element, The List is")
removenumber(A) # 함수 호출
실행 결과
Enter the size of the array ::9 Enter the number n=10 n=20 n=30 n=40 n=50 n=60 n=70 n=80 n=90 After remove third element, The List is 30 60 90 40 80 50 20 70 10
실행 결과에서 볼 수 있듯이, 9개의 요소를 가진 리스트에서 먼저 30, 60, 90이 차례로 제거되고, 이후 남은 요소들을 대상으로 같은 규칙이 반복 적용되어 리스트가 완전히 빌 때까지 출력이 이어집니다.