배열과 그 배열의 범위 [startval, endval]이 주어졌을 때, 이 알고리즘은 배열을 세 부분으로 나눕니다.
- 첫 번째 부분: startval보다 작은 모든 요소가 앞쪽에 위치합니다.
- 두 번째 부분: startval 이상 endval 이하 범위에 속하는 모든 요소가 그다음에 위치합니다.
- 세 번째 부분: endval보다 큰 모든 요소가 마지막에 위치합니다.
이 방식은 데이터를 특정 구간을 기준으로 분류해야 할 때 유용하며, 리스트 컴프리헨션(list comprehension)을 활용하면 간결하게 구현할 수 있습니다.
예시
입력: A = [1, 14, 51, 12, 4, 2, 54, 20, 87, 98, 3, 1, 32] startval = 14, endval = 54 출력: A = [1, 12, 4, 2, 3, 1, 14, 51, 20, 32, 54, 87, 98]
알고리즘
Step 1: 리스트를 세 부분으로 나눕니다.
- 첫 번째 부분: startval보다 작은 요소들
- 두 번째 부분: startval 이상 endval 이하인 요소들
- 세 번째 부분: endval보다 큰 요소들
Step 2: 세 부분을 순서대로 하나로 연결(concatenate)합니다.
예제 코드
def partition_array(input, lowVal, highVal): # 입력 리스트를 세 부분으로 분리 my_first = [num for num in input if num < lowVal] my_second = [num for num in input if (num >= lowVal and num <= highVal)] my_third = [num for num in input if num > highVal] # 세 부분을 모두 연결 print(my_first + my_second + my_third) # 드라이버 프로그램 if __name__ == "__main__": my_input = [10, 140, 50, 200, 40, 20, 540, 200, 870, 980, 30, 10, 320] my_lowVal = 140 my_highVal = 200 partition_array(my_input, my_lowVal, my_highVal)
실행 결과
[10, 50, 40, 20, 30, 10, 140, 200, 200, 540, 870, 980, 320]
실행 결과를 보면 140 미만의 값들이 앞부분에, 140 이상 200 이하의 값들이 중간에, 200 초과의 값들이 뒷부분에 배치된 것을 확인할 수 있습니다. 참고로 각 부분 내부에서는 원래 배열의 순서가 유지되므로, 정렬이 필요하다면 추가적으로 sorted() 함수를 적용하면 됩니다.