리스트 컴프리헨션(List Comprehension)은 파이썬에서 가장 널리 사용되는 기법 중 하나입니다. 이 글에서는 이 기법을 활용해 0과 1이 무작위 순서로 섞여 있는 배열에서 0은 왼쪽에, 1은 오른쪽에 배치하도록 분리하는 방법을 알아봅니다.
핵심 아이디어는 간단합니다. 배열을 한 번 순회하면서 값이 0인 요소만 모은 리스트와 값이 1인 요소만 모은 리스트, 총 두 개의 리스트를 만든 뒤, 이 두 리스트를 연결(concatenate)하면 원하는 결과를 얻을 수 있습니다.
예제
입력 :: a=[0,1,1,0,0,1] 출력 :: [0,0,0,1,1,1]
알고리즘
seg0s1s(A) /* A는 사용자가 입력한 배열이며, A의 요소는 0과 1의 조합이어야 합니다 */ 1단계: 먼저 배열 전체를 순회합니다. 2단계: 배열의 각 요소를 검사합니다. 요소가 0이면 왼쪽에, 1이면 오른쪽에 위치시킵니다. 3단계: 두 개의 리스트를 연결하여 최종 결과를 만듭니다.
예제 코드
# 배열 리스트에서 0과 1을 분리하는 함수
def seg0s1s(A):
n = ([i for i in A if i==0] + [i for i in A if i==1])
print(n)
# 드라이버 프로그램
if __name__ == "__main__":
A=list()
n=int(input("배열의 크기를 입력하세요 ::"))
print("숫자를 입력하세요 ::")
for i in range(int(n)):
k=int(input(""))
A.append(int(k))
print("새로운 배열 리스트 ::")
seg0s1s(A)실행 결과
배열의 크기를 입력하세요 ::6 숫자를 입력하세요 :: 1 0 0 1 1 0 새로운 배열 리스트 :: [0, 0, 0, 1, 1, 1]
동작 원리 살펴보기
위 코드에서 핵심은 다음 한 줄입니다.
n = ([i for i in A if i==0] + [i for i in A if i==1])
첫 번째 리스트 컴프리헨션 [i for i in A if i==0]은 배열 A에서 값이 0인 요소만 순서대로 추출하고, 두 번째 [i for i in A if i==1]은 값이 1인 요소만 추출합니다. 이 둘을 + 연산자로 연결하면 0들이 앞쪽에, 1들이 뒤쪽에 정렬된 새로운 리스트가 완성됩니다.
이 방식은 배열을 두 번 순회하므로 시간 복잡도는 O(n)이며, 추가적인 정렬 함수 없이도 직관적으로 문제를 해결할 수 있다는 장점이 있습니다.