코딩 테스트의 알고리즘 문제 풀이를 포함하여 모든 프로그래밍은 데이터를 다루는 행위인 것 처럼, 자료형에 대한 이해는 첫 걸음이라 할 수 있다.
파이썬은 다른 언어에서 사용되는 기본 자료형 뿐만 아니라, 사전, 집합 등 강력한 기능을 제공하는 자료형을 내장하여 편리하다.
가장 기본적인 자료형, 코딩 테스트에선 대부분 '정수형'을 다루는 문제가 출제된다.
양의 정수, 음의 정수, 0
a = 1000
a = -7
a = 0
소수점 아래 데이터를 포함하는 수 자료형
변수에 소수점을 붙인 수를 대입하면, 실수형 변수로 처리된다.
a = 123.45
a = -543.21
# 소수부, 정수부가 0이라면 생략할 수 있다.
b = 5. # 5.0
b = -.7 # -0.7
실수형 데이터 표현에서 e나 E를 이용한 지수 표현방식을 이용할 수 있다.
e 다음에 오는 수는 10의 지수부를 의미한다.
1e9
= 1 X 10^9
123.45e1
= 1234.5
123.45e-1
= 12.345
컴퓨터 시스템은 수 데이터 처리에 2진수를 이용하며, 부동 소수점 방식을 사용하는데,
실수 정보를 표현하는 정확도의 한계를 가진다.
실수의 연산에 오차가 발생한다.
때문에, round()
함수를 이용한다.
round(a,b)
는 실수 a를 소수 b 자리에서 반올림한다.
사칙연산+, -, *, /
을 이용해 계산한다.
파이썬에서 나누기 연산자는 나눠진 결과를 실수형으로 처리한다.
나머지를 확인할 땐, 나머지 연산자%
를 사용한다.
또한, 나눈 결과에서 몫만 얻고자 할 때, 몫//
연산자를 이용한다.
이외에도, 거듭제곱 연산자**
등이 있다.
a=7
b=3
print(a/b) # 2.333...
print(a%b) # 1
print(a//b) # 2
print(a**b) # 343
문자열 변수를 초기화할 때는 큰따옴표나 작은따옴표를 사용한다.
문자열 내에 따옴표를 포함시킬 때는, 이스케이프 문자\
를 사용한다.
파이썬에서 지원하는 문자열 연산은 문자열을 처리하는데 유용하게 사용될 수 있다.
a = "Hi"
b = "Name"
print(a+ " " +b) # Hi Name
print(a*3) # HiHiHi
파이썬 문자열은 내부적으로 리스트처럼 처리되어, 인덱싱이나 슬라이싱을 이용할 수 있다.
print(a[0]) # H
print(a[-1]) # i
print(b[0:len(b)]) # Name
여러개의 데이터를 연속적으로 담아 처리하기 위해 사용한다.
파이썬의 리스트는 C, JAVA같은 언어의 배열(Array) 기능을 포함하며,
내부적으로 '연결 리스트 자료구조'를 채택한다.
a = [1,2,3,4,5,6,7,8]
a = [0]*10
인덱스 값으로 특정 원소에 접근하는 것을 인덱싱이라 한다.
파이썬의 인덱스값은 양의 정수와 음의 정수를 사용할 수 있다.
음의 정수는 원소를 거꾸로 탐색하며, -1
은 마지막 원소가 나온다.
a = [1,2,3,4,5,6,7,8]
print(a[4]) # 5
print(a[-1]) # 8
리스트에서 연속적인 원소들을 가져올 땐, 슬라이싱을 이용한다.
대괄호 안에 콜론:
을 넣어 시작 인덱스
와 끝 인덱스-1
을 설정할 수 있다.
a = [1,2,3,4,5,6,7,8]
print(a[1:4]) #[2,3,4]
print(a[4:len(a)] #[5,6,7,8]
print(a[5:-1]) #[6,7]
리스트를 초기화하는 방법 중 하나이다.
대괄호 안에 조건문과 반복문을 넣는 방식으로 초기화 할 수 있다.
arr = [i for i in range(20) if i % 20 == 1] # 0~19 중 홀수를 원소로 함
일반적인 소스코드로 작성 했을 때 보다 짧고 간결하다.
arr = []
for i in range(20):
if(i%2 == 1):
arr.append(i);
이러한 리스트 컴프리헨션은 2차원 리스트를 초기화 할 때 효과적일 수 있다.
n = 3
m = 4
arr = [[0]*m for _ in range(n)]
만약, 2차원 배열을 초기화 하는데 리스트 컴프리헨션을 사용하지 않았다면,
예기치 않은 문제를 일으킬 수 있다.
arr = [[0]*2]*2
arr[1][1] = 5
print(arr) # [[0,5],[0,5]]
이처럼 내부 리스트가 같은 래퍼런스로 인식된다.
append()
: 리스트에 원소를 추가sort()
: 기본 정렬기능, 오름차순 정렬 O(NlogN)
reverse()
: 리스트의 원소의 순서를 뒤집는다.insert()
: 리스트에 원소 삽입 insert(idx, elem)
count()
: 리스트에서 특정 값의 데이터의 개수를 센다.remove()
: 특정 값을 가진 원소를 제거한다.리스트와 비슷한 자료형인데, 차이가 있다.
[]
를 이용하지만 튜플은 소괄호()
를 이용한다.tup = (1,2,3,4)
tup[2] = 7 # error
선언된 값을 변경하려 하면, 원소에 대입이 불가능 하다는 메시지가 출력된다.
튜플 자료형은 그래프 알고리즘 구현에 자주 사용된다.
최단 경로 알고리즘 에선 우선순위 큐를 이용하는데, 우선순위 큐에 한번 들어간 값은 변경되지 않는다.
그래서, 우선순위 큐에 들어가는 데이터를 튜플로 구성하면, 변경하면 안되는 값이 변경되지 않았는지 확인할 수 있다.
또한, 리스트에 비해 상대적으로 공간 효율적이다.
각 원소의 '성질이 서로 다를 때' 주로 사용한다.
사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형이다.
리스트나 튜플은 값을 순차적으로 저장한다.
사용되는 대표적인 예시는 사전으로, 키로 한글 단어, 값으로 영어 단어를 넣어,
한글 키로 데이터에 접근하면 된다.
파이썬의 사전 자료형은 '해시 테이블'을 이용하여, 검색 및 수정에서 O(1)
시간에 처리한다.
data = dict()
data["사과"] = 'apple'
print('사과' in data) # True
print(data["사과"]) # apple
keys()
: 키 데이터만 뽑아서 리스트로 이용
values()
: 값 데이터만 뽑아서 리스트로 이용
집합set
사전 자료형 처럼 순서가 없어 인덱싱으로 값을 얻을 수 없다.
집합 자료형은 키가 존재하지 않고, 값 데이터 만을 담는다.
data = set([1,2,3,1,2,3])
data = {1,2,3,1,2,3}
print(data) # {1,2,3}
집합 연산은 합집합|
, 교집합&
, 차집합-
이 있다.
add()
: 집합에 데이터를 추가
update()
: 집합에 여러개 데이터를 한번에 추가
remove()
: 특정 값 제거
data = set([1,1,2,2,3,3,4])
arr = [7,9]
data.add(5)
data.update(arr)
data.remove(1)