배열

코린이서현이·2024년 1월 27일
0

📌 배열과 파이썬의 리스트

배열과 리스트 모두 순서가 있으며, 연속적으로 값을 저장한다. 따라서 값이 저장된 상대적 위치인 인덱스를 가진다.
순차적으로 접근이 가능하기 때문에, 빠르게 접근할 수 있다.

배열

일반적으로 배열은 동질적이며, 정적이다.
동일한 데이터 타입끼리만 저장이 가능하고, 자료의 크기를 변경할 수 없는 정적인 형태이다.

파이썬의 리스트

파이썬의 리스트 또한 연속적인 자료구조로 인덱스를 가지지만, 이질적이며, 동적이다.
즉, 여러가지의 데이터타입을 담을 수 있으며 크기를 자유롭게 바꿀 수 있다.

파이썬에서는 배열에 실제 값이 아닌 값의 메모리 주소를 저장하기 때문이다.
따라서 다양한 데이터 타입을 담을 수 있는 것이다.

배열의 성능

배열의 요소 하나에 접근,수정하는 작업 : 선형 시간 복잡도 O(1)
배열 순회 : O(n)
정렬되지 않은 요소를 검색 : O(n)
정렬된 요소를 검색 : O(log n)

배열에 삽입하려고 할 때

배열은 순서대로 저장되어 있기 때문에, 삽입을 위해서는 그 뒤에 있는 모든 요소를 전부 이동해야한다. 비효율적이다.
특히 배열의 크기가 매우 크고, 앞부분에 삽입할 경우 많은 시간이 소요된다.

따라서 삽입이 자주 일어난다면 리스트는 비효율적일 수 있으며, 링크드 리스트나 파이썬 딕셔너리를 사용하는 것이 더 바람직하다.

만약 정적 배열이라면?

다음 배열의 메모리가 비어있는지 모르기 때문에 새로운 배열을 만들어 복사와 삽입을 하고, 기존 배열은 삭제한다. (모든 경우에 그런 것은 아님)

파이썬의 과다할당

파이썬은 앞선 방식이 아닌 리스트에 필요 이상의 메모리를 할당한 다음, 모니터링을 통해 메모리를 효율적으로 관리하는 방법을 선택한다.

교재의 다양한 예제

교재의 다양한 코드를 담아보았다.

🔍 0을 움직이고 기존 리스트 순서 유지하기

def move_zeros(a_list):
    zero_index = 0
    for i,v in enumerate(a_list):
        if v != 0:
            a_list[zero_index] = v
            if zero_index != i: #변동이 있었다는 뜻...?
                a_list[i] = 0
            zero_index += 1
        return a_list

🔍 리스트 결합하기

cobine_list01 = ["가나","토마토","생수"]
cobine_list02 = [1,2]

cobine_list = list(zip(cobine_list01,cobine_list02)) #둘 중 리스트의 크기가 작은 것에 맞추어서

print(cobine_list)

🔍 중복 요소 찾기

def find_duplicate_elements(a_list):
    a_set = set()
    temp = 0
    for i in a_list:
        original_length = len(a_set)
        a_set.add(i)
        if original_length == len(a_set):
            temp += 1
    return list(a_set),temp

duplicate_list = [0,1,1,3,3,3,4]
duplicate_removal_list,a = find_duplicate_elements(duplicate_list)

print(duplicate_removal_list,a)

# 중복이 여러개일경우 여러개를 출력해서 리팩토링해봄
def retrun_dup(a_list):
    dup = set()
    a_set = set()

    for i in a_list:
        l1 = len(a_set)
        a_set.add(i)
        l2 = len(a_set)
        if l1==l2:
            dup.add(i)

    return list(dup)

y = retrun_dup(duplicate_list)
print(y)

🔍 두 리스트의 교집합 찾기

def make_inter_list(a_list,b_list):
    new_list = [v for v in a_list if v in b_list]
    return new_list

list1 = [1,3,4,5,6]
list2 = [3,4,5]

list3 = make_inter_list(list1,list2)
print(list3)

set1 = set(list1)
set2 = set(list2)

list3_1 = list(set1.intersection(set2))

print(list3_1)

기억하기

중복인지 검사할 때 집합set()은 중복을 허용하지 않는 다는 특징을 이용하자.

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글