Ch.2 배열과 문자열

배열의 메모리 구조 — 연속 메모리와 O(1) 접근

배열이 연속 메모리에 저장되는 원리를 이해한다인덱스 접근이 O(1)인 이유를 수식으로 설명한다

왜 배열은 인덱스로 바로 접근할 수 있을까?

사물함이 일렬로 나란히 있습니다. 3번 사물함을 찾으려면? 처음부터 세지 않아도 바로 갈 수 있죠.

리스트와 배열은 뭐가 다를까? 파이썬의 list는 진짜 배열일까?

연속 메모리 할당이 O(1) 접근의 비밀입니다. 메모리 주소 계산 한 번이면 끝!

lightbulb

핵심 개념

배열(Array)

같은 타입의 데이터를 연속 메모리에 저장하는 자료구조

인덱스(Index)

배열 내 요소의 위치를 나타내는 정수 (0부터 시작)


article

핵심 내용

사물함 100개가 일렬로 나란히 있다고 상상해보세요. 37번 사물함을 찾으러 갈 때 1번부터 셀 필요가 있나요?

배열도 마찬가지입니다. 연속된 메모리 공간에 데이터가 나란히 저장되기 때문에 위치를 계산 한 번으로 바로 접근합니다

배열의 i번째 요소 주소는 한 줄 공식으로 구할 수 있습니다

주소 계산 공식 address(i) = base_address + i × element_size 예) base = 1000, int(4byte), i = 3 address(3) = 1000 + 3 × 4 = 1012

덧셈과 곱셈 한 번씩이면 끝! 데이터가 1억 개여도 접근 시간은 동일합니다. 이것이 O(1) 시간복잡도입니다

배열과 연결 리스트를 시간복잡도로 비교해봅시다

면접 포인트: 배열은 읽기에 강하고, 연결 리스트는 삽입/삭제에 강합니다

Python의 list는 내부적으로 동적 배열(Dynamic Array)입니다

# 배열 기본 연산과 시간복잡도
arr = [10, 20, 30, 40, 50]

# O(1) — 인덱스 접근
print(arr[2])          # 30

# O(1) — 맨 뒤 추가
arr.append(60)         # [10, 20, 30, 40, 50, 60]

# O(n) — 맨 앞 삽입 (전체 시프트)
arr.insert(0, 5)       # [5, 10, 20, 30, 40, 50, 60]

# O(n) — 중간 삭제
arr.pop(3)             # [5, 10, 20, 40, 50, 60]

# O(1) — 길이 확인
print(len(arr))        # 6

배열에서 인덱스를 이용한 접근의 시간복잡도는?

Python list에서 맨 앞에 원소를 삽입하면 시간복잡도는?

배열의 크기가 클수록 인덱스 접근 시간도 오래 걸린다

Python의 list.append()는 평균적으로 O(1)이다

배열의 i번째 요소 주소 공식: address(i) = base_address + i × ____

배열의 i번째 요소 주소 공식: address(i) = base_address + i × ____

배열의 메모리 구조

key

핵심 용어

📦

배열(Array)

같은 타입 데이터를 연속 메모리에 저장하는 자료구조

🔢

인덱스(Index)

배열 내 위치를 나타내는 정수 (0부터 시작)

📍

Base Address

배열의 시작 메모리 주소

🔍

인덱스 접근

배열 O(1) / 연결 리스트 O(n)

맨 앞 삽입

배열 O(n) / 연결 리스트 O(1)

맨 뒤 삽입

배열 O(1)* / 연결 리스트 O(1)

🗑️

중간 삭제

배열 O(n) / 연결 리스트 O(1)

edit_note

정리 노트

배열 — 연속 메모리와 O(1) 접근

핵심 개념

배열
같은 타입 데이터를 연속 메모리에 저장
주소 공식
address(i) = base + i × element_size → O(1)
동적 배열
Python list, 용량 초과 시 2배 확장 (amortized O(1))

배열 vs 연결 리스트

인덱스 접근
배열 O(1) / 연결 리스트 O(n)
맨 앞 삽입
배열 O(n) / 연결 리스트 O(1)
메모리
배열: 연속 / 연결 리스트: 분산(포인터 추가 메모리)

면접 포인트: '배열은 읽기에 강하고, 연결 리스트는 삽입/삭제에 강하다'

image

시각 자료

다이어그램: ds-d08
다이어그램: ds-d11
check_circle

핵심 정리

  • 1배열은 연속 메모리에 저장 → 인덱스 접근 O(1)
  • 2주소 계산: base + i × element_size
  • 3Python list는 동적 배열 (amortized O(1) append)
  • 4배열 = 읽기 특화 / 연결 리스트 = 삽입·삭제 특화

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작