코딩 테스트를 대비하여 기본적인 파이썬 문법들을 정리하기로 하였다.
코딩 테스트의 대부분의 문제에서는 실수형이 아니라 정수형을 다루게 된다.
정수를 다루는 자료형.
양의 정수, 음의 정수, 0 존재.
코딩 테스트의 대부분 문제들의 입출력 형태는 정수형.
cf. 파이썬은 기본 자료형이 사전 자료형 기능을 지원하기 때문에, 별도의 라이브러리를 사용하지 않아도 된다.
소수점 아래의 데이터를 포함하는 자료형.
변수의 타입 없이, 변수에 소수점을 붙이면 자동으로 실수형 변수로 처리된다.
소수부 0 or 정수부 0은 생략 가능. ex. 5. , -.7, ...
유효숫자e^지수 = 유효숫자 10^지수 형태로 지수를 표현할 수 있다. ex. 1e8 = 110^8, 123e-3 = 0.123
cf. 최단 경로의 최댓값 INF를 대체하여 1e9(10^9)과 같은 형태로 표현 가능.
실수끼리의 연산은 예상과 다를 수 있다.
컴퓨터는 실수형을 저장하기 4바이트나 8바이트의 고정된 메모리를 할당하기 때문에 실수를 정확히 표현하지 못하기 때문이다.
ex. a = 0.3 + 0.2, a == 0.5 -> false
따라서 반올림 함수인 round(실수형 데이터, 반올림할 자릿수 - 1) 함수를 호출하여 위 문제를 해결한다. ex. round(1.234,2) = 1.23
파이썬의 사칙연산은 나누기 연산자(/)를 제외하고는 나머지 프로그래밍 언어와 동일.
나머지 연산(/)은 실수형으로 처리.
몫 연산자(//)가 따로 존재.
거듭제곱 연산자(**
) 존재. ex. 3 ** 5 = 45
a = [1, 2, 3]와 같은 형태.
인덱스는 0부터 시작.
요소 접근 -> a[i]
빈 리스트 선언 -> a = list() or a = []
ex. 크기가 n이고 모든 값이 0인 1차원 리스트 초기화
n = 5
a = [0] * n
print(a) // 출력 결과 : [0, 0, 0, 0, 0]
인덱싱(Indexing) : 리스트의 특정 원소에 접근하는 것. (양, 음의 정수 모두 가능. 음의 정수 - 리스트 거꾸로 탐색)
a = [1, 2, 3] // ex a[-1] : 뒤에서 첫번째 원소 출력, a[3] : 네번째 원소 출력
a[3] = 4 // a의 세번째 원소 4로 변경.
슬라이싱(Slicing) : 리스트에서 연속적인 위치를 갖는 원소들을 가져오는 것.
ex. a리스트의 세번째 원소부터 다섯 번째 원소의 데이터 추출 -> a[2 : 5] // a[2], a[3], a[4] 추출
리스트를 초기화 하는 방법 중 하나.
해당 방법 이용 시, 대괄호 안에 조건문과 반복문을 삽입하여 리스트를 초기화 할 수 있다.
ex . array = [i for i in range(10) if i % 2 = 0] // 0~9까지의 수 중 짝수만 포함하는 리스트를 만들 때.
-> 결과 : [2, 4, 6, 8]
ex 2. array = [i * i for i in range(1, 5)] // 1부터 4까지 수의 제곱 값을 포함하는 리스트를 만들 때.
-> 결과 : [1, 4, 9, 16, 25]
특정 크기의 2차원 배열을 초기화 할 때 사용해야 한다.
ex. array = [[0]
*
b for _ in range(n)] // a * b 크기의 2차원 리스트 초기화, a = 2, b = 3
-> 결과 : [[0, 0, 0], [0, 0, 0]]
ex 2. array[1][1] = 5
-> 결과 : [[0, 5, 0], [0, 5, 0]] // bc. 내부적으로 포함된 2개의 리스트가 모두 동일한 객체에 대한 2개의 레퍼런스로 인식.
cf. 단순 반복 출력처럼 반복을 위한 변수의 값이 필요가 없을 때는
_
를 사용한다.
ex. Hello World 5번 출력for _ in range(5) print("Hello World")
변수명.append()
sort() : 기본 정렬 기능으로 오름차순으로 정렬한다. - 시간 복잡도: O(NlogN)
변수명.sort()
reverse() : 리스트의 원소의 순서를 역순으로 바꾼다. - 시간 복잡도: O(N)
변수명.reverse() or 변수명.reverse(reverse = True) // 내림차순
insert() : 특정한 인덱스 위치에 원소를 삽입할 때 사용한다. - 시간 복잡도: O(N)
변수명.insert(삽입할 위치 인덱스, 삽입할 값)
count() : 리스트에서 특정한 값을 가지는 데이터의 개수를 센다. - 시간 복잡도: O(N)
변수명.count(특정 값)
remove() : 특정한 값을 갖는 원소를 제거하지만, 값을 가진 원소가 여러 개면 하나만 제거한다. - 시간 복잡도: O(N)
변수명.remove(특정 값)
예시
a = [1, 2, 3]
print("리스트: ", a) // 출력 -> 리스트: [1, 3, 2]
a.append(4)
print("리스트: ", a) // 출력 -> 리스트: [1, 3, 2, 4]
a.sort()
print("리스트: ", a) // 출력 -> 리스트: [1, 2, 3, 4]
a.insert(2,5)
print("리스트: ", a) // 출력 -> 리스트: [1, 2, 5, 3, 4]
print("값이 2인 원소의 개수: ", a.count(2)) // 출력 -> 값이 2인 원소의 개수: 1
a.remove(1)
print("값이 1인 원소 제거: ", a) // 출력 -> 값이 1인 원소 제거: [2, 5, 3, 4]
cf. insert() 함수 사용 시 원소의 개수가 N개면 시간 복잡도는 O(N). append() 함수는 시간 복잡도 O(1).
따라서 insert() 함수를 많이 사용하면 시간 초과로 테스트를 통과하지 못할 수 있다.
cf. remove()의 시간 복잡도 O(N)이므로, 많이 사용 시 시간 초과 문제가 발생할 수 있다.
remove()와 insert() 함수의 시간 복잡도는 원소의 위치를 조정하는 과정이 있어 O(N)이 된다.
따라서, 특정한 값의 원소를 모두 제거할 시 다음과 같은 방식을 사용하는 것이 좋다.a = [1, 2, 3, 4, 4, 5] reomve_set = [2, 4] result = [i for i in a if i not in remove_set] // remove_set에 없는 원소만은 result에 저장. print(result) // 출력 -> [1, 3, 5]
문자열은 큰 따옴표, 작은 따옴표로 둘다 선언 가능.
큰 문자열 안에 작은 따옴표 사용 가능. 반대도 가능.
백슬래시(\
) 사용시 문자열 안에서 작은 따옴표, 큰 따옴표 사용 가능.
ex.
print('hello world') // 출력 -> hello world
print("hello \"Python\"!") // 출력 -> hello "Python"!
덧셈을 할 시 문자열끼리 연결이 된다.
"Hello" + " " + "World" // 결과 -> Hello World
문자열 변수를 양의 정수와 곱하는 경우, 문자열이 그 값만 큼 더해진다.
a = "Hello"
print(a * 3) // 출력 : HelloHelloHello
문자열은 내부적으로 리스트와 같이 처리. 인덱싱, 슬라이싱 가능.
a = "abcd"
print(a[1 : 3]) // 출력 -> bc
한번 선언된 값을 변경할 수 없다.
리스트는 대괄호, 튜플은 소괄호를 사용한다.
그래프 알고리즘 구현 시 자주 사용한다.
리스트에 비해 공간 효율적이고, 각 원소의 성질이 다를 때 주로 사용한다.
ex.
a = (1, 2, 3)
a[2] = 4 // 오류 발생
순서 x -> 인덱싱으로 값을 얻지 못한다.
키(Key)와 값(Value) 쌍을 데이터로 가지는 자료형.
내부적으로 해시 테이블(Hash Table)을 이용하기 때문에, 데이터의 검색 및 수정의 시간 복잡도는 O(1)이다.
리스트보다 데이터 처리 속도가 빠르다.
'원소 in 사전'의 형태를 사용하여 특정한 원소가 있는지 검사 할 수 있다.
ex.
data = dict()
data['korea'] = '한국'
data['japanese'] = '일본'
data['china'] = '중국'
print(data) // 출력 -> {'korea': '한국', 'japanese': '일본', 'china': '중국'}
if 'korea' in data
print("'한국'을 키로 가지는 데이터 존재.") // 출력 -> '한국'을 키로 가지는 데이터 존재.
keys() : 키 데이터만 뽑아서 리스트로 생성
values(): 값 데이터만 뽑아서 리스트로 생성
data = dict()
data['korea'] = '한국'
data['japanese'] = '일본'
data['china'] = '중국'
key_list = data.kets()
value_list = data.values()
print(key_list) // 출력 -> dict_keys(['korea', 'japanese', 'china'])
print(value_list) // 출력 -> dict_values(['한국', '일본', '중국'])
for key in key_list
print(data[key])
// 출력 -> 한국
일본
중국
중복 허용 x
순서 x -> 인덱싱으로 값을 얻지 못한다.
값 데이터만 존재.
특정 원소 검색 시간 복잡도 O(1)
특정한 데이터가 이미 등장한 적이 있는지 여부를 체크할 때 매우 유용하다.
ex.
data = set([1, 1, 2, 2, 3, 3]) // 집합 초기화 방식 1
print(data) // 출력 -> {1, 2, 3}
data = {1, 1, 2, 2, 3, 3} // 집합 초기화 방식 2
print(data) // 출력 -> {1, 2, 3}
data_1 = set([1, 2, 3])
data_2 = set([2, 3, 4])
print(a | b) // (합집합) 출력 -> {1, 2, 3, 4}
print(a & b) // (교집합) 출력 -> {2, 3}
print(a - b) // (차집합) 출력 -> {1, 4}
add(): 하나의 값을 추가할 때 사용.
data = set([1, 2, 3])
data.add(4)
print(data) // 출력 -> {1, 2, 3, 4}
update(): 여러 개의 값을 한꺼번에 추가하고자 할 때 사용.
data.update([5, 6])
print(data) // 출력 -> {1, 2, 3, 4, 5, 6}
remove(): 특정한 값을 제거할 때 사용.
data.remove(3)
print(data) // 출력 -> {1, 2, 4, 5, 6}