알고리즘 공부를 하면서 파이썬의 기초적인 문법들과 라이브러리들을 확실히 알고 쓰는게 좋을거같아서 복습하는겸 정리하는 게시글
리스트 자료형
리스트는 여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용한다.
파이썬의 리스트 자료형은 C나 자바와 같이 내부적으로 배열(Array)를 채택하고 있고 동시에 연결 리스트 자료구조 기능을 포함하고 있어 append(), reverse() 등의 메서드를 지원한다.
리스트 만들기
리스트는 대괄호([])안에 원소를 넣어 초기화하며 쉼표(,)로 원소를 구분한다.
리스트의 원소에 접근할 때는 인덱스 값을 괄호 안에 넣는다.
비어있는 리스트를 선언하고자 할 때는 대괄호를 이용할 수 있다
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a) # => [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[4]) # => 5
a = list()
print(a) # => []
a = []
print(a) # => []
# 크기가 N이고 모든 값이 0인 1차원 리스트 초기화
a = [0] * N
print(a) # => [0,0,0,.....0]
리스트의 인덱싱과 슬라이싱
인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱이라고 한다. 파이썬의 인덱스 값은 양수와 음수 모두 사용할 수 있고 음수를 넣으면 원소를 거꾸로 탐색한다
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[-1]) # => 9 <뒤에서 첫 번째 원소 출력>
print(a[-3]) # => 7 <뒤에서 세 번째 원소 출력>
a[3] = 7
print(a) # => [1,2,3,7,5,6,7,8,9]
또한 리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때는 슬라이싱을 이용할 수 있다.
이때는 대괄호 안에 콜론(:) 을 넣어서 시작 인덱스와 (끝 인덱스 -1) 을 설정할 수 있다.
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
#두 번째 원소부터 네 번째 원소까지
print(a[1 : 4]) # => [2, 3, 4]
리스트 컴프리헨션
리스트 컴프리헨션은 리스트를 초기화 하는 방법 중 하나이다.
대괄호 안에 조건문과 반목문을 넣는 방식으로 초기화 할 수 있다.
# 0부터 19까지 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]
print(array) # => [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
만약 위와 같은 코드를 일반 코드로 작성하면
array = []
for i in range(20):
if i % 2 == 0:
array.append(i)
리스트 컴프리헨션은 2차원 리스트를 초기화할 때 매우 효과적으로 사용할 수 있다.
# N x M 크기의 2차원 리스트 초기화
n, m = 3, 4
array = [[0] * m for _ in range(n)]
print(array) # => [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
리스트 관련 기타 메서드
리스트와 관련한 기타 메서드를 사용하면 리스트 자료형을 효과적으료 이용할 수 있다.

insert()는 중간에 원소를 삽입한 후에 원소 위치를 조정해줘야 해서 시간복잡도가 O(N)으로 느리고
remove()도 마찬가지다. 따라서 이 둘을 남발하다보면 시간초과가 발생할 수 도 있다.
문자열 자료형
문자열 변수를 초기화할 때는 큰따옴표나 작은따옴표를 이용한다. 코드를 작성하면서 문자열 안에 큰따옴표나 작은 따옴표가 포함되어야 하는경우 백슬래시(\)를 사용하면 포함할 수 있다.
data = 'Hello World'
print(data) # => Hello World
data = "Dont't you know \"Python\"?"
print(data) # => Don't you know "Python"?
문자열 변수를 양의 정수와 곱하는 경우 문자열이 그 값만큼 여러번 더해진다
a = "String"
print(a*3) # => StringStringString
파이썬의 문자열은 내부적으로 리스트와 같이 처리된다. 문자열은 여러 개의 문자가 합쳐진 리스트라고 볼 수 있다. 따라서 문자열 데이터에 대해서도 마찬가지로 인덱싱과 슬라이싱을 이용할 수 있다.
a = "ABCDEF"
print(a[2:4]) # => CD
튜플 자료형
파이썬의 튜플 자료형은 리스트와 거의 비슷한데 다음과 같은 차이가 있다.
- 튜플은 한 번 선언도니 값을 변경할 수 없다.
- 리스트는 대괄호를([]) 이용하지만 튜플은 소괄호를(()) 이용한다
튜플 데이터를 선언한 다음 값을 출력하고 튜플의 값을 변경하면 에러가 발생한다.
a = (1, 2, 3, 4)
print(a) # => (1, 2, 3, 4)
a[2] = 7

튜플 자료형은 그래프 알고리즘을 구현할 때 자주 사용된다, 예를 들어 다익스트라 최단 경로 알고리즘처럼 최단 경로를 찾아주는 알고리즘의 내부에서는 우선순위 큐를 이용하는데 해당 알고리즘에서 우선순위 큐에 한 번 들어간 값은 변경되지 않는다. 그래서 그 우선순위 큐에 들어가는 데이터를 튜플로 구성하여 소스코드를 작성한다.
이럴 경우 자신이 실수로 값을 변경하는걸 예방할 수 있다.
사전 자료형 (딕셔너리)
사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형이다. 앞서 다루었던 리스트나 튜플은 값을 순차적으로 저장한다는 특징이 있다. 예를 들어 리스트의 값이 [1,2,3]이라고 한다면, 첫 번째 원소는 a[0]으로 1이라는 값을 가진다. 하지만 딕셔너리는 키-값 쌍을 데이터로 가진다는 점에서 우리가 원하는 변경 불가능한 데이터를 키로 사용할 수 있다.
파이썬의 사전 자료형은 내부적으로 '해시 테이블' 을 이용하므로 기본적으로 데이터의 검색 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
print(data) # => {'사과' : 'Apple', '바나나' : 'Banana', '코코넛' : 'Coconut'}
사전 자료형에 특정한 원소가 있는지 검사할 때는 '원소 in 사전' 의 형태를 사용할 수 있다. 이는 리스트나 튜플에 대해서도 사용할 수 있는 문법이다
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
if '사과' in data:
print("사과")
# => 사과
사전 자료형 관련 함수
대표적인 함수로는 키와 값을 별도로 뽑아내는 함수가 있다. 키 데이터만 뽑아서 리스트로 이용할 때는 keys()
값 데이터만 뽑아서 리스트로 이용할 때는 values() 함수를 이용한다
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
# 키 데이터만 담은 리스트
key_list = data.keys()
# 값 데이터만 담은 리스트
value_list = data.values()
print(key_list) # => dict_keys (['사과', '바나나', '코코넛'] )
print(value_list) # => dict_values ( [ 'Apple' , 'Banana' , 'Coconut' ])
# 각 키에 따른 값을 하나씩 출력
for key in key_list :
print(data[key] ) #=> Apple \n Banana \n Coconut
집합 자료형 Set
파이썬에서는 집합(Set)을 처리하기 위한 집합 자료형을 제공하고 있다. 집합은 기본적으로 리스트 혹은 문자열을 이용해서 만들 수 있는데, 집합은 다음과 같은 특징이 있다.
- 중복을 허용하지 않는다
- 순서가 없다
딕셔너리와 셋은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다. 셋은 딕셔너리와 달리 키가 존재하지 않고 값 데이터만 담게 된다. 특정 원소가 존재하는지를 검사하는 연산의 시간 복잡도는 O(1) 이다.
셋은 '특정한 데이터가 이미 등장한 적이 있는지 여부'를 체크할 때 매우 효과적이다. 집합 자료형을 초기화 할 때는 set() 함수를 이용하거나 중괄호 ({}) 안에 각 원소를 콤마를 기준으로 구분해서 넣으면 된다
# 집합 자료형 초기화 방법 1
data = set([1, 1, 2, 3, 4, 4, 5])
print(data) # => {1, 2, 3, 4, 5}
# 집합 자료형 초기화 방법2
data = {1, 1, 2, 3, 4, 4, 5}
print(data) # => {1, 2, 3, 4, 5}
집합 자료형의 연산
기본적인 집합 연산으로는 합집합, 교집합, 차집합 연산이 있다.
합집합은 '|' 교집합은 '&' 차집합은 '-'을 이용한다
a = set([1. 2. 3. 4. 5])
b = set([3, 4, 5, 6, 7])
print(a|b) # => {1, 2, 3, 4, 5, 6, 7}
print(a&b) # => {3, 4, 5}
print(a-b) # => {1, 2}
집합 자료형 관련 함수
하나의 집합 데이터에 값을 추가할 때는 add()함수, 여러개의 값을 한번에 추가할 때는 update() 함수
특정한 값을 제거할 때는 remove()함수를 사용할 수 있다.
data = set([1, 2, 3])
print(data) # => {1, 2, 3}
#새로운 원소 추가
data.add(4)
print(data) # => {1, 2, 3, 4}
#새로운 원소 여러개 추가
data.update([5, 6])
print(data) # => {1, 2, 3, 4, 5, 6}
#특정한 값을 갖는 원소를 삭제
data.remove(3)
print(data) # => {1, 2, 4, 5, 6}'공부기록 > 알고리즘 공부' 카테고리의 다른 글
| 파이썬 문법 정리 2. <내장함수, itertools, heapq, bisect, collections, math> (0) | 2022.05.20 |
|---|---|
| 그리디 알고리즘이란?, 백준 설탕배달 (0) | 2022.04.23 |
| 트리와 힙 (파이썬 네이티브 코드로 구현하기) (0) | 2022.04.21 |
| 1. 알고리즘 공부 배열, 리스트 (파이썬 네이티브 코드로 구현하기) (0) | 2022.03.24 |
| 백준 1927번 <파이썬> (힙에 대해 공부하기) (0) | 2022.03.16 |