본문 바로가기

코딩테스트

[코딩테스트] 배열

배열

 

'코딩 테스트 합격자 되기'의 첫 번째 챕터인 배열입니다.

배열 개념에 대해 간단히 정리해보겠습니다.


배열은 인덱스와 값이 일대일로 대응하는 자료구조입니다.

배열은 특정 위치(인덱스)에 있는 데이터에 바로 접근할 수 있습니다. 이를 임의 접근(random access)라고 합니다.

인덱스는 0부터 시작합니다.

#배열 생성

arr = [0, 0, 0, 0]
arr = [0] * 4
arr = list(range(4)) # [0, 1, 2, 3]

 

리스트는 여러 가지 방법으로 생성할 수 있습니다.

  • 대괄호를 사용하여 빈 리스트를 표시하기: []
  • 대괄호를 사용하여 쉼표로 항목 구분하기: [a], [a, b, c]
  • 리스트 컴프리헨션 사용하기: [x for x in iterable]
  • 형 생성자를 사용하기: list() 또는 list(iterable)

 

리스트 컴프리헨션

컴프리헨션(Comprehension)은 '이해'나 '파악'이라는 뜻의 영단어입니다.

그러나 Python에서의 컴프리헨션은 리스트(List Comprehension), 세트(Set Comprehension), 딕셔너리(Dictionary Comprehension) 등의 데이터 구조를 생성하기 위한 간결하고 효율적인 방법을 지칭합니다.

# 일반적인 방법
squares = []
for x in range(10):
    squares.append(x**2)

# 리스트 컴프리헨션 사용
squares = [x**2 for x in range(10)]

 

세트 컴프리헨션

세트 컴프리헨션은 중괄호 {}를 사용하며, 리스트 컴프리헨션과 비슷하게 동작합니다.

다만, 세트는 중복된 값을 허용하지 않고 순서가 없는 컬렉션입니다.

# 0부터 9까지의 숫자 중에서 짝수만 포함하는 세트 생성
even_numbers = {x for x in range(10) if x % 2 == 0}
print(even_numbers)  # 출력: {0, 2, 4, 6, 8}

 

딕셔너리 컴프리헨션

딕셔너리 컴프리헨션은 키와 값의 쌍을 생성합니다. 중괄호 {} 안에 키: 값 형식을 사용합니다.

# 키는 0부터 9까지의 숫자, 값은 각 숫자의 제곱으로 하는 딕셔너리 생성
squares = {x: x**2 for x in range(10)}
print(squares)  # 출력: {0: 0, 1: 1, 2: 4, 3: 9, ..., 9: 81}

이렇게 세트와 딕셔너리 컴프리헨션을 사용하면 간결하고 효율적으로 새로운 세트나 딕셔너리를 생성할 수 있습니다.


배열과 리스트

배열(Array)과 리스트(List)는 비슷해 보이지만 실제로는 다른 개념입니다.

일반적으로 배열은 고정된 크기를 가집니다. 배열의 크기는 선언 시에 지정되며, 변경이 불가합니다.

그리고 배열은 같은 데이터 타입의 요소만 저장할 수 있습니다.

그러나, 파이썬의 경우에는 배열을 지원하는 문법은 없고 그 대신 리스트를 지원합니다.

파이썬의 리스트는 동적으로 크기를 조절할 수 있으며, 서로 다른 타입의 데이터를 요소로 저장할 수 있습니다.

 

동적 배열

배열은 차원과는 무관하게 메모리에 연속 할당됩니다.

배열의 각 데이터는 메모리의 낮은 주소에서 높은 주소 방향으로 연이어 할당됩니다.

Python 리스트는 동적 메모리 할당 방식을 사용합니다.

여기(How Python list works)에 잘 설명되어 있는데요.

 

리스트는 '포인터의 배열'이라고도 할 수 있습니다.

아래 그림처럼, 실제 값 대신 그 값이 저장되어 있는 메모리의 주소 값을 저장하기 때문입니다.

그리고 .appeend(item)을 하게 되면 먼저 배열에 남은 공간이 있는지 확인합니다.

배열이 이미 꽉 차 있다면, Python은 새롭고 더 큰 배열을 위해 메모리를 할당하고 모든 이전 항목을 새 항목에 복사합니다.

다시 말해 리스트의 초기 크기에 맞춰 메모리 블록이 할당되며, 리스트의 크기가 변할 때(요소가 추가되거나 제거될 때) 필요에 따라 새로운 메모리가 할당되고 기존 요소들은 새 위치로 복사됩니다.

이러한 방식은 크기가 변하는 데이터셋을 효율적으로 처리할 수 있도록 해줍니다.

 

이상으로 배열과 리스트의 차이점, 메모리 할당 방식, 생성하고 사용하는 법에 대해 알아보았습니다. 다음에는 배열 연산의 시간 복잡도와 자주 사용하는 기능에 대해 알아보겠습니다.