이것이 취업을 위한 코딩테스트다 with 파이썬
수 자료형
정수형
실수형
- 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리
- 소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성
# 양의 실수
a = 123.12
print(a)
# 음의 실수
a = -123.12
print(a)
# 소수부가 0일 때 0을 생략
a = 5.
print(a) # 출력 : 5.0
# 정수부가 0일 때 0을 생략
a = -.7
print(a) # 출력 : -0.7
지수 표현 방식
: 코테에서 많이 사용됨.
최단 경로 문제에서는 도달할 수 없는 노드에 대하여 최단 거리를 '무한(INF)'로 설정
최단 경로로 가능한 최댓값이 10억 미만이라면 무한(INF)를 표현할 때 10억을 이용할 수 있음 -> 1e9
혹은 987,654,321 이라고 적으면 1e9와 유사할 정도로 크므로 이렇게 적기도 한다.
유효숫자e^지수 = 유효숫자 x 10^지수
# 10억의 지수 표현 방식
a = 139
print(a) # 출력 : 1000000000.0
# 752.5
a = 75.25e1
print(a) # 출력 : 752.5
# 3.954
a = 3954e-3 # 출력 : 3.954
보통 컴퓨터 시스템은 수 데이터를 처리할 때 2진수를 이용하며, 실수를 처리할 때 부동 소수점 방식을 이용.
실수형을 저장하기 위해 4바이트/8바이트라는 고정된 크기의 메모리 할당 -> 실수 정보 표현 정확도에 한계 가짐
a = 0.3 + 0.6
print(a) # 0.8999999999999999 출력
if a == 0.6:
print(True)
else:
print(False) # False 출력
소수점 값을 비교하는 작업이 필요하는 문제라면 실수 값을 비교하지 못할 가능성 존재.
-> round()
함수 이용 !
첫 번째 인자는 실수형 데이터, 두 번째 인자는 (반올림하고자 하는 위치 -1)
123.456을 소수점 셋째 자리에서 반올림하려면 round(123.456, 2) -> 123.46
두번째 인자 없이 인자 하나만 넣으면 소수점 첫째 자리에서 반올림
a = 0.3 + 0.6
print(round(a, 4)) # 0.9 출력
if a == 0.6:
print(True) # True 출력
else:
print(False)
수 자료형의 연산
파이썬에서 나누기 연산자(/)는 결과를 실수형으로 처리한다.
특정한 변수가 홀수인지 알아볼 때는 2로 나눈 나머지가 1인지를 확인한다.
a = 7
b = 3
# 나누기
print(a / b) # 2.33333333333335
# 나머지
print(a % b) # 1
# 몫
print(a // b) # 2
# 거듭제곱
print(a ** b) # 343
리스트 자료형
리스트(= 배열 = 테이블)는 여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용할 수 있다.
파이썬의 리스트 자료형은 내부적으로 배열을 채택하고 있으며,
연결 리스트 자료구조 기능을 포함하고 있어 append(), remove() 등의 메서드를 지원한다.
C++의 STL vector와 유사하다.
리스트 만들기
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a)
print(a[4]) # 인덱스 4, 다섯 번째 원소에 접근
# 빈 리스트 선언 방법 1)
a = list()
print(a) # 출력 : []
# 빈 리스트 선언 방법 2)
a = []
print(a) # 출력 : []
코딩 테스트 문제에서는 주로 크기가 N인 1차원 리스트를 초기화해야 하는데
다음 방식으로 초기화하면 편리하다.
# 크기가 N이고, 모든 값이 0인 1차원 리스트 초기화
n = 10
a = [0] * n
print(a) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
리스트의 인덱싱과 슬라이싱
인덱싱 : 인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것
파이썬의 인덱스값은 양의 정수와 음의 정수를 모두 사용할 수 있으며, 음의 정수를 넣으면 원소를 거꾸로 탐색하게 된다.
a = 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[-1]) # 뒤에서 첫 번째 원소 출력 -> 9
print(a[-3]) # 뒤에서 세 번째 원소 출력
a[3] = 7 # 네 번째 원소 값 변경
슬라이싱 : 리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때, 대괄호 안에 콜론(:)을 넣어서 시작 인덱스와 (끝 인덱스 -1)을 설정
끝 인덱스의 경우 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]
일반 for 문으로 작성하는 것보다 간결하니 꼭 기억해두자.
# 1부터 9까지의 수의 제곱 값을 포함하는 리스트
array = [i * i for i in range(1, 10)]
print(array) # 출력 : [1, 4, 9, 16, 25, 36, 49, 64, 81]
리스트 컴프리헨션은 코딩 테스트에서 2차원 리스트를 초기화할 때 효과적으로 사용될 수 있다.
# N * M 크기의 2차원 리스트 초기화
n = 3
m = 4
array = [[0] * m for _ in range(n)]
print(array) # 출력: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
** 언더바(_) 의 역할?
파이썬 자료구조/알고리즘에서, 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바(_)를 자주 사용한다.
for _ in range(5):
print("Hello World")
ㄴ 단순히 5번 출력할 때.
참고로 특정 크기의 2차원 리스트를 초기화할 때는 반드시 리스트 컴프리헨션을 이용해야 한다.
# N * M 크기의 2차원 리스트 초기화 (잘못된 방법)
n = 3
m = 4
array = [[0] * m] * n
print(array) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
array[1][1] = 5
print(array) # [[0, 5, 0, 0], [0, 5, 0, 0], [0, 5, 0, 0]]
array[1][1] = 5 를 했을 때, 3개의 리스트에서 인덱스 1에 해당하는 원소들의 값이 모두 5로 바뀌었다.
내부적으로 포함된 3개의 리스트가 모두 동일한 객체에 대한 3개의 레퍼런스로 인식되기 때문이다.
따라서 특정한 크기를 가지는 2차원 리스트를 초기화할 때에는 리스트 컴프리헨션을 꼭 ! 이용해야 한다.
리스트 관련 기타 메서드
메서드명 | 사용법 | 설명 | 시간 복잡도 |
append() | 변수명.append() | 리스트에 원소 하나 삽입 | O(1) |
sort() | 변수명.sort() | 오름차순 정렬 | O(NlogN) |
변수명.sort(reverse = True) | 내림차순 정렬 | O(N) | |
reverse() | 변수명.reverse() | 리스트의 원소 순서 모두 뒤집음 | O(N) |
insert() | 변수명.insert(인덱스, 값) | 특정한 인덱스 위치에 원소 삽입 | O(N) |
count() | 변수명.count(값) | 리스트에서 특정한 값을 가지는 데이터의 개수 세기 | O(N) |
remove() | 변수명.remove(특정 값) | 특정한 값을 갖는 원소 제거. 값을 가진 원소가 여러 개면 하나만 제거함. |
O(N) |
주목할 것들!
- insert()
- 원소의 개수가 N개면, 시간 복잡도는 O(N)
- append()는 O(1)인데 반해, 동작이 느림. 중간에 원소를 삽입하고, 리스트의 원소 위치를 조정해주기 때문.
- insert() 를 남발하면 '시간 초과'로 테스트 통과를 못할 수도 있다.
- remove()
- insert() 와 마찬가지로 리스트에서 중간 원소를 삭제하고 리스트의 원소 위치를 조정해주기 때문에 O(N)
특정한 값의 원소를 모두 제거하려면 어떻게 해야할까?
다른 프로그래밍 언어에서는 remove_all()과 같이 간단하게 지울 수 있지만, 파이썬에 이러한 기본 함수는 없다.
따라서 다음과 같은 방법을 이용하면 좋다.
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}
# remove_set에 포함되지 않은 값만을 저장
result = [i for i in a if i not in remove_set]
print(result) # [1, 2, 4]
result = [i for i in a if i not in remove_set]
a에 포함된 원소를 하나씩 확인하며 그 원소가 remove_set에 포함되어 있지 않았을 때만
리스트 변수인 result에 넣겠다는 의미이다.