리스트

리스트(List)는 순서대로 저장하는 시퀀스이자 변경 가능한 목록(Mutable List)를 말한다.

입력 순서가 유지되며, 내부적으로는 동적 배열로 구현되어 있다.

(C++에서는 std::vector , 자바에서는 ArrayList 가 동적 배열을 구현한 자료형이다.)

파이썬 리스트의 가장 좋은 점은 매우 다양한 기능을 제공한다는 점이다.

스택을 사용할지, 큐를 사용할지 고민하지 않아도 되며, 스택과 큐에서 사용 가능한 모든 연산을 함께 제공한다.

코딩 테스트 시 다른 언어에 비해 매우 유리한 조건을 갖게 되는 셈이다.

리스트의 주요 연산 시간 복잡도

리스트의 경우 탐색 시 값의 존재 유무를 확인하려면 정렬된 경우 이진 검색이 효율적이다.

그러나 매번 정렬이 필요하기 때문에 리스트의 경우에는 모든 엘리먼트를 순차적으로 조회하는 형태로 구현되어 있다. 이 경우 최악의 경우 O(n)이 소요된다.

리스트의 활용 방법

# 비어있는 리스트 선언의 2가지 방법
>>> a = list()
>>> a = []

# 초깃값 지정 선언
>>> a = [1, 2, 3]
# 값 추가
>>> a.append(4)
[1, 2, 3, 4]

# 특정 위치 인덱스를 지정해 요소 추가
# 인덱스 3에 5를 삽입
>>> a.insert(3, 5)
[1, 2, 3, 5, 4]

# 숫자 외에도 문자와 불리언을 자유롭게 삽입할 수 있다.
>>> a.append('안녕')
>>> a.append(True)
>>> a
[1, 2, 3, 5, 4, '안녕', True]
# 타입 변환 등의 별도 부가 처리 없이 유연하게 활용할 수 있다.
# 매우 편리하며 생산성이 매우 높다.
# 값을 꺼내올 때는 인덱스 지정
>>> a[3]
5

# 슬라이싱(Slicing) 기능이 있어 특정 범위 내의 값을 매우 편리하게 가져올 수 있다.
# 문자열에 유용하게 활용되는 슬라이싱은 리스트에도 동일한 형태로 활용 가능하다.
# 인덱스 1에서 인덱스 3 이전까지의 값 가져오기
>>> a[1:3]
[2, 3]

# 반복문 구성/순회 없이 시작, 종료 인덱스 설정으로 간단히 출력 가능하다.
# 시작 인덱스 생략
>>> a[:3]
[1, 2, 3]
# 종료 인덱스 생락
>>> a[4:]
[4, '안녕', True]

# 홀수 번째 인덱스의 값 가져오기
# 세 번째 파라미터를 부여하면 단게(Step)의 의미로, 
# [1:4:2]와 같이 단계를 2로 지정하면 두 칸씩 건너 뛰게 된다.
>>> a[1:4:2]
[2, 5]

# 존재하지 않는 인덱스를 조화할 경우 IndexError 발생
>>> a[9]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module> 
IndexError: list index out of range

# 인덱스가 리스트의 길이를 넘어설 때 발생, try 구문으로 예외처리 가능
try:
    print(a[9])
except IndexError:
    print('존재하지 않는 인덱스')
# 리스트 요소를 삭제하는 방법 2가지
# 인덱스로 삭제하기: del 키워드
>>> del a[1]
>>> a
[1, 3, 5, 4, '안녕', True]
# 값으로 삭제하기: remove 함수
a.remove(3)
[1, 5, 4, '안녕', True]
# pop 함수 - 스택의 pop 연산처럼 추출로 처리
# 삭제될 값을 리턴하고 삭제됨
>>> a.pop(3)
'안녕'
>>> a
[1, 5, 4, True]