파이썬의 자료형
정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 사전
정수형
정수를 다루는 자료형
양의 정수, 0, 음의 정수가 포함
실수형
소수점 아래의 데이터를 포함하는 수 자료형
소수부가 0일 때 0 생략 가능
지수 표현 방식
파이썬에서는 e나 E를 이용한 지수 표현 방식 이용
e, E 다음에 오는 수는 10의 지수부를 의미
ex) 1e9 -> 10의 9제곱(1,000,000,000). 1 x 10^9
최단 경로 알고리즘에서는 도달할 수 없는 노드에 대해 최단 거리를 무한(INF)로 설정하곤 함
이때 가능한 최댓값이 10억 미만이라면 무한(1NF)의 값으로 1e9를 이용할 수 있음
# 1,000,000,00의 지수 표현 방식
a = 1e9
print(a) // 1000000000.0
#752.5
b = 75.25e1
print(b) // 725.5
# 3.954
c = 3954e-3
print(c) // 3.954
리스트 컴프리헨션
리스트를 초기화하는 방법 중 하나
대괄호 안에 조건문과 반복문을 적용해 리스트 초기화
arr = [i for i in range(10)]
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
리스트 컴프리헨션은 2차원 리스트를 초기화할 때 효과적으로 사용
N x M 크기의 2차원 리스트 초기화
arr = [[0] * m for _ in range(n)]
언더바의 사용
반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바를 사용
리스트 관련 기타 메서드
리스트에서 특정 값을 가지는 원소 모두 제거
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5} # 집합 자료형
result = [i for i in a if i not in remove_set]
print(result)
// [1, 2, 4]
튜플 자료형
리스트와 유사하지만 몇 가지 차이가 존재
한 번 선언된 값 변경 불가
소괄호(()) 이용
리스트에 비해 공간 효율적
a = (1, 2, 3, 4, 5, 6, 7, 8, 9)
# 4번째 원소만 출력
print(a[3]) // 4
# 두 번째 원소부터 4번째 원소까지 출력
print(a[1:4]) // (2, 3, 4)
튜플을 사용하면 좋은 경우
1. 서로 다른 성질의 데이터를 묶어서 관리할 때 - 최단 경로 알고리즘에선(비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용
2. 데이터의 나열을 해싱의 키 값으로 사용해야 할 때 - 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있음
3. 리스트보다 메모리를 효율적으로 사용해야 할 때
사전 자료형
키(key)와 값(value)의 쌍을 데이터로 가지는 자료형 - 변경 불가능한 자료형을 키로 사용할 수 있음
앞서 다뤘던 리스트나 튜플이 값을 순차적으로 저장하는 것과 대비
파이썬의 사전 자료형은 해시 테이블을 이용하므로 데이터 조회, 수정에 있어서 O(1) 시간에 처리 가능
keys() 함수: 키 데이터만 뽑아서 리스트로 이용
values() 함수: 값 데이터만 뽑아서 리스트로 이용
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
print(data) // {'사과': 'Apple', '바나나': 'Banana', '코코넛': 'Coconut'}
key_list = data.keys()
value_list = data.values()
print(key_list) // dict_keys(['사과', '바나나', '코코넛'])
집합 자료형
집합의 특징: 중복 허용 x, 순서 x
초기화 방법
1. 리스트 혹은 문자열을 이용해서 초기화(set() 함수)
2. 중괄호({}) 안에 각 원소를 콤마를 기준으로 구분해 삽입해 초기화
데이터 조회, 수정에 있어 O(1)의 시간에 처리 가능
# 초기화 방법 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}
집합 자료형 관련 함수
data = set([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}
사전 자료형과 집합 자료형의 특징
리스트, 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값 얻을 수 있음
하지만 사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값 얻을 수 없음
사전의 키 혹은 집합의 원소를 이용해 O(1)의 시간 복잡도로 조회
빠르게 입력 받기
sys 라이브러리에 정의되어 있는 sys.stdin.readline() 메서드 사용
단, 입력 후 엔터가 줄 바꿈 기호로 입력되므로 rstrip() 메서드 함께 사용
import sys
data = sys.stdin.readline().rstrip()
자주 사용되는 표준 출력 방법
print()는 기본적으로 출력 이후 줄바꿈 수행 - 원치 않는 경우 end 속성 사용
f-string: 문자열 앞에 접두사 f를 붙여 사용
answer = 7
print(f"정답은 {answer}이다") // 정답은 7이다
파이썬의 pass 키워드
아무것도 처리하고 싶지 않을 때 pass 키워드 사용
ex) 디버깅 과정에서 일단 조건문의 형태만 만들어놓고 조건문을 처리하는 부분은 비워놓고 싶은 경우
score = 80
if score > 80:
pass
else:
print("성적이 낮다")
반복문 예제
// 특정 번호 학생 제외
scores = [90, 85, 77, 65, 97]
cheating_std_list = {2, 4}
for i in range(5):
if i+1 in cheating_std_list:
continue
if scores[i] >= 80:
print(i+1, "번 학생은 합격")
// 1 번 학생은 합격
// 5 번 학생은 합격
함수 정의 - global 키워드
global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고 함수 바깥에 선언된 변수를 바로 참조
a = 0
def func():
global a
a += 1
for i in range(10);
func()
print(a) // 10
전역변수로 리스트가 선언되면 리스트 객체의 내부 메서드 호출은 오류없이 수행 가능
하지만 함수 내에 전역변수와 같은 이름의 지역변수가 선언되면 함수 내에서는 지역변수가 우선적으로 참조됨!
arr = [1,2,3,4,5]
def func():
arr.append(6)
print(arr)
func() // [1,2,3,4,5,6]
def func2():
arr = [3,4,5]
arr.append(6)
print(arr)
func2() // [3,4,5,6]
람다 표현식
함수 간단하게 작성 가능
특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점이 특징
def add(a, b):
return a+b
# 일반적인 add() 메서드 사용
print(add(3,7))
# 람다 표현식으로 구현한 add() 메서드
print((lambda a, b: a+b)(3,7))
ex) 점수순으로 오름차순으로 출력하기
arr = [('홍길동', 50), ('이순신', 32), ('아무개', 74)]
def my_key(x):
return x[1]
print(sorted(arr, key=my_key)) // [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
print(sorted(arr, key=lambda x: x[1]) // [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
ex) 여러 리스트에 적용
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
result = map(lambda a, b: a+b, list1, list2)
print(list(result)) // [7,9,11,13,15]
실전에서 유용한 표준 라이브러리
내장 함수: 기본 입출력부터 정렬 함수까지 기본적인 함수 제공
itertools: 반복되는 형태의 데이터를 처리하기 위한 유용한 기능 제공(순열, 조합 라이브러리는 코테에서 자주 사용)
heapq: 힙 자료구조 제공(우선순위 큐 기능을 구현하기 위해 사용)
bisect: 이진 탐색 기능 제공
collections: 덱(deque), 카운터(Counter) 등의 유용한 자료구조 포함
math: 필수적인 수학적 기능 제공(팩토리얼, 제곱근, 최대공약수(GCD) 등등...)
순열과 조합
순열(nPr): 서로 다른 n개에서 서로 다른 r개를 선택해 일렬로 나열
ex) {'a', 'b', 'c'} 에서 3개를 선택해 나열: 'abc', 'acb' 'bac'. 'bca', 'cab'. 'cba'
조합(nCr): 서로 다른 n개에서 순서에 상관없이 서로 다른 r개 선택
ex) {'a', 'b', 'c'} 에서 순서 고려 않고 2개 뽑는 경우: 'ab', 'ac', 'bc'
# 순열
import itertools from permutations
data = ['a', 'b', 'c']
result = list(permutations(data, 3))
# 조합
import itertools from combinations
result2 = list(combinations(data, 3))
중복 순열과 중복 조합
from itertools import product
data = ['a', 'b', 'c']
result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기(중복 허용)
print(result)
from itertools import combinations_with_replacement
data = ['d', 'e', 'f']
result2 = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기(중복 허용)
print(result2)
Counter
등장 횟수를 세는 기능
리스트와 같은 반복 가능한 객체가 주어졌을 때 내부 원소가 몇 번씩 등장했는지 알려줌
from collections import Counter
counter = Counter(['red', 'red', 'blue', 'blue', 'blue', 'green'])
print(counter['blue']) # 3
print(dict(counter) # 사전 자료형으로 변환 {'red': 2, 'blue': 3, 'green': 1}
최대공약수와 최대공배수
math 라이브러리의 gcd() 함수
import math
# 최소 공배수(LCM)
def lcm(a,b):
return a * b // math.gcd(a,b)
a = 21
b = 14
print(math.gcd(21, 14) # 최대공약수(gcd) 계산 - 7
print(lcm(21, 14) # 최소공배수(lcm) 계산 - 42
'CodingTest' 카테고리의 다른 글
Programmers - 성격 유형 검사하기 (0) | 2023.10.24 |
---|---|
SWEA - 패턴 마디의 길이(2007) (2) | 2023.10.23 |
코딩테스트 준비 - 알고리즘 성능 평가 (0) | 2023.10.21 |
SWEA - 스도쿠 검증(1974) (1) | 2023.10.21 |
SWEA - 어디에 단어가 들어갈 수 있을까(1979) (0) | 2023.10.21 |