Python
Python 코딩테스트 대비 기본 문법
sihyeong
2023. 6. 19. 20:46
- 파이썬은 e나 E를 통한 지수 표현 방식 이용 가능
- 예를들어 1e9라고 입력하게 되면 10의 9제곱 (1,000,000,000)가 된다.
- 임의의 큰 수를 표현하기 위해 사용하고 최단 경로 알고리즘에서는 도달할 수 없는 노드에 대하여 최단 거리를 무한(INF)로 설정하곤 한다.
- 이때 가능한 최대값이 10억 미만이라면 무한(INF)의 값으로 1e9를 이용할 수 있다.
- 실수형 데이터를 사용하고자 할때 쓴다.
- 실수형을 표현하기 때문에 정확도는 낮다. 이럴 때 round() 함수를 이용해서 해결한다.
- round(123.456, 2)를 통해 123.46의 값을 얻어낼 수 있다.
a = 0.3 + 0.6
print(round(a, 4)) // 소수점 4째 자리에서 올림
if round(a, 4) == 0.9:
print(True)
else:
print(False)
위의 결과로
0.9
True
가 출력된다.
나누기 연산자( / ) : 결과를 실수형으로 반환
거듭 제곱 연산자(**)
몫 연산자(//): 몫을 정수형으로 반환
- 리스트는 대괄호([ ]) 안에 원소를 넣어 초기화하며, 쉼표( , )로 구분한다.
- 비어 있는 리스트를 선언하고자 할 때는 list() 혹은 간단히 [ ]를 이용할 수 있다.
n = 10
a = [0] * n
print(a)
실행 결과
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0값을 가지고 있는 크기 10짜리 리스트 생성
- 리스트의 슬라이싱
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[1 : 4])
실행 결과
[2, 3, 4]
: 연산자를 통해 [n : m]
n부터 m-1까지의 리스트 값을 추출 가능
- 음의 정수로 뒤쪽에서부터 접근 가능하다.
- 리스트 컴프리헨션 (대괄호 안에 조건문과 반복문 적용해서 리스트 초기화 가능)
array = [i for i in range(10)]
print (array)
실행 결과
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- 리스트 컴프리헨션은 2차원 리스트를 초기화할 때 효과적으로 사용가능
- N X M 크기의 2차원 리스트 한 번에 초기화 해야 할 때 매우 유용함
- 좋은 예시 : array = [[0] * m for in range(n)]
- 잘못된 예시 : array = [[0] * m] * n
- 위 코드는 전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식된다.
함수명 | 사용법 | 설명 | 시간 복잡도 |
append() | 변수명.append() | 리스트에 원소 하나 삽입할 때 사용한다. | O(1) |
sort() | 변수명.sort() 변수명.sort(reverse = True) |
오름차순, True: 내림차순으로 정렬 | O(NlogN) |
reverse() | 변수명.reverse() | 리스트 원소의 순서를 모두 뒤집어 놓는다. | O(N) |
insert() | insert(삽입할 위치 인덱스, 삽입할 값) | 특정한 인덱스 위치에 원소를 삽입할 때 사용한다. | O(N) |
count() | 변수명.count(특정값) | 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용한다. | O(N) |
remove() | 변수명.remove(특정 값) | 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거한다. | O(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[2] = 'a' <- 코드 작동 X
튜플
- 튜플 자료형은 리스트와 유사하지만 문법적 차이가 있다.
- 한번 선언된 값을 변경할 수 없다.
- 리스트는 대괄호([ ])를 사용하지만, 튜플은 ( () ) 소괄호를 사용한다.
- 튜플은 리스트에 비해 상대적으로 공간 효율적이다.
튜플 사용하면 좋은 점
- 서로 다른 성질의 데이터를 묶어서 관리해야 할 때
- 최단 경로 알고리즘에서 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용함
- 데이터의 나열을 해싱의 키 값으로 사용해야 할 때
- 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있다.
- 리스트보다 메모리를 효율적으로 사용해야 할 때
사전 자료형
- 사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형이다.
- 앞서 다루었던 리스트나 튜플이 값을 순차적으로 저장하는 것과는 대비된다.
- 사전 자료형은 키와 값의 쌍을 데이터로 가지며, 원하는 변경 불가능한 자료형을 키로 사용할 수 있다.
- 파이썬의 사전 자료형은 해시 테이블을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
- 사전 자료형은 dict() 를 통해 초기화 할 수 있다.
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
print(data)
if '사과' in data:
print("'사과'를 키로 가지는 데이터가 존재합니다.")
실행 결과
{'사과' : 'Apple', '바나나' : 'Banana', '코코넛' : 'Coconut'}
'사과'를 키로 가지는 데이터가 존재합니다.
- 사전 자료형에서는 키와 값을 별도로 뽑아내기 위한 메서드를 지원한다.
- 키 데이터만 뽑아서 리스트로 이용할 때는 keys() 함수를 이용함
- 값 데이터만 뽑아서 리스트로 이용할 때는 values() 함수를 이용함
- 초기화 시 { 키 : 값, 키 : 값 }을 통해 사전 자료형 생성 가능
집합 자료형
- 중복을 허용하지 않음
- 순서가 없음
- 집합은 리스트 혹은 문자열을 이용해 초기화할 수 있다.
- 이때 set() 함수를 사용한다.
- 혹은 중괄호({})안에 각 원소를 콤마를 기준으로 구분하여 삽입함으로써 초기화 할 수 있다.
- 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
data = set([1, 1, 2, 3, 4, 4, 5])
print(data)
data = {1, 1, 2, 3, 4, 4, 5}
print(data)
실행 결과
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
집합 자료형의 연산
- 기본적인 집합 연산으로는 합집합, 교집합, 차집합 연산 등이 있따.
- 합집합 : 집합 A에 속하거나 B에 속하는 원소로 이루어진 집합(A U B)
- 교집합 : 집합 A에도 속하고 B에도 속하는 원소로 이루어진 집합 (A N B)
- 차집합 : 집합 A의 원소 중에서 B에 속하지 않는 원소들로 이루어진 집합 (A - B)
a = set([1, 2, 3, 4, 5])
b = set([3, 4, 5, 6, 7])
# 합집합
print(a|b)
# 교집합
print(a&b)
# 차집합
print(a - b)
실행 결과
{1, 2, 3, 4, 5, 6, 7}
{3, 4, 5}
{1, 2}
- 변수.add(값) 으로 원하는 값을 추가할 수 있고
- 변수.update([값1, 값2])를 통해 원소 여러개를 한번에 추가 가능
- 변수.remove(값)으로 특정한 값을 갖는 원소 삭제도 가능
- 리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있다.
- 사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.
- 사전의 키 혹은 집합의 원소를 이용해 O(1)의 시간 복잡도로 조회합니다.
자주 사용되는 표준 입력 방법
- input() 함수는 한 줄의 문자열을 입력받는 함수
- map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용합니다.
- 예시) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다움과 같이 사용한다.
- list(map(int, input().split())) : 입력을 받고, 공백을 기준으로 구분하고, 구분된 각 원소를 정수형으로 변환하고 리스트형식으로 바꿔줌
- 예시) 공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 단순히 다음과 같이 사용함
- a, b, c = map(int, input().split())
빠르게 입력받기
- 파이썬의 경우 sys 라이브러리에 정의되어 있는 sys.stdin.readline() 메서드 사용
- 단 입력 후 엔터가 줄 바꿈 기호로 입력되므로 rstrip() 메서드를 함께 사용한다.
표준 출력 방법
- 기본 출력은 print() 함수를 이용한다.
- 각 변수를 콤마를 이용해서 띄어쓰기로 구분하여 출력할 수 있다.
- print()는 기본적으로 출력 후 줄 바꿈을 수행한다.
- 줄바꿈을 원치 않는 경우 'end '속성을 이용할 수 있다.
a = 1
b = 2
print(a,b)
print(7, end=" ")
print(8, end=" ")
answer = 7
print("정답은 " + str(answer) + "입니다.")
실행 결과
1 2
7 8 정답은 7입니다.
f-string
- 파이썬 3.6부터 사용 가능하며, 문자열 앛에 접두사 'f'를 붙여 사용한다.
- 중괄호 안에 변수명을 기입하여 간단한 문자열과 정수를 함께 넣을 수 있다.
answer = 7
print(f"정답은 {answer}입니다.")
실행 결과
정답은 7입니다.
들여쓰기
- 들여쓰기를 통해 블록을 구분한다.
- 파이썬 스타일 가이드라인에서는 4개의 공백 문자를 사용하는 것을 표준으로 설정하고 있다.
논리 연산자
- X and Y
- X or Y
- not X
기타 연산자
- 다수의 데이터를 담는 자료형을 위해 in 연산자와 not in 연산자가 제공됩니다.
- 리스트, 튜플, 문자열, 딕셔너리 모두에서 사용이 가능하다.
- x in 리스트 : 리스트 안에 x가 들어가 있을 때 참이다
- x not in 문자열 : 문자열 안에 x가 들어가 있지 않을 때 참이다.
pass 키워드
- 아무것도 처리하고 싶지 않을 때 pass 키워드를 사용한다.
- 예시) 디버깅 과정에서 일단 조건문의 형태만 만들어 놓고 조건문을 처리하는 부분은 비워놓고 싶은 경우
score = 85
if score >=80:
pass # 나중에 작성할 코드
else:
print('성적이 80점 미만입니다.')
print('프로그램을 종료합니다.')
실행 결과
프로그램을 종료합니다.
조건부 표현식
- if ~ else 문을 한줄에 작성할 수 있다.
- 다만 if후에 처리할 내용은 if 앞에 작성하는 차이점이 있다.
score = 85
result = "Success" if score>=80 else "Fail"
print(result)
실행 결과
Success
부등식
- 수학의 부등식을 그대로 사용 가능하다
- 0 < x < 20 작동가능
x = 15
if 0 < x < 20:
print("x는 0 이상 20 미만의 수 입니다.")
실행 결과
x는 0이상 20미만의 수 입니다.
함수
def 함수명(매개변수):
실행할 소스코드
return 반환 값
- 파라미터의 변수를 직접 지정 가능 이 경우엔 매개변수의 순서가 달라도 상관이없음
def add(a,b):
print('함수의 결과:', a + b)
add(b = 3, a = 7)
global 키워드
- global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 됨
a = 0
def func():
global a
a +=1
for i in range(10):
func()
print(a)
실행 결과
10
여러 개의 반환값
- 파이썬에서의 함수는 여러 개의 반환 값을 가질 수 있다.
- 3개의 값을 반환하면 값을 받을 때에도 3개의 변수로 받아야 한다. 받을 변수가 부족하거나 많으면 에러남
람다 표현식
- 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다.
def add(a,b):
return a+b
print(add(3,7))
print((lambda a,b: a+b)(3,7))
실행 결과
10
10
array = [('홍길동', 50), ('이순신', 32),('아무개', 74)]
def my_key(x):
return x[1]
print(sorted(array, key=my_key))
print(sorted(array, key=lambda x:x[1]))
실행 결과
[('홍길동', 50), ('이순신', 32),('아무개', 74)]
[('홍길동', 50), ('이순신', 32),('아무개', 74)]
여러 개의 리스트에 람다식 적용
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]
result = map(lambda a, b:a+b, list1, list2)
print(list(result))
- map() 함수의 반환 자료형은 map 객체이기 때문에 해당 데이터를 사용하기 위해서는 list형이나 tuple 형으로 형변환을 해줘야 사용이 가능하다.
실전에서 유용한 표준 라이브러리
- itertools : 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공한다. 특히 순열과 조합 라이브러리는 코딩 테스트에서 자주 사용된다.
- heapq : 힙 자료구조를 제공한다. 일반적으로 우선순위 큐 기능을 구현하기 위해 사용된다.
- bisect : 이진 탐색 기능을 제공한다.
- collections : 덱, 카운터 등의 유용한 자료구조를 포함한다.
- math : 필수적인 수학적 기능을 제공한다. 팩토리얼, 제곱근, 최대공약수, 삼각함수 관련 함수부터 파이와 같은 상수를 포함한다.
자주 사용되는 내장 함수
- sum ( list )
- min(v1, v2, v3)
- max(v1, v2, v3)
- eval(" 사칙연산 문자열 ") : 사칙연산 문자열을 계산해서 값을 반환한다.
- sorted( list ) : 오름차순 정렬
- sorted( list , reverse = True) : 내림차순 정렬
- sorted( list , key=함수) : 함수에 해당하는 데이터를 키로 잡고 해당 값으로 정렬한다.
순열과 조합
- 모든 경우의 수를 고려해야 할 때 itertools 라이브러리를 이용해서 효과적으로 사용 가능
- 순열 : 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열하는 것
- {'A', 'B', 'C'}에서 세 개를 선택하여 나열하는 경우 : 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA'
- 조합 : 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 것
- {'A', 'B', 'C'}에서 순서를 고려하지 않고 두 개를 뽑는 경우 : 'AB', 'AC', 'BC'

순열
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permutations(data, 3))
print(result)
실행 결과
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
조합
from itertools import combinations
data = ['A', 'B', 'C']
result = list(combinations(data, 2))
print(result)
실행 결과
[('A', 'B'), ('A', 'C'), ('B', 'C')]
중복 순열
from itertools import product
data = ['A', 'B', 'C']
result = list(product(data, repeat=2))
print(result)
실행 결과
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
중복 조합
from itertools import combinations_with_replacement
data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2))
print(result)
실행 결과
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
Counter
- 파이썬 collections 라이브러리의 Counter는 등장 횟수를 세는 기능을 제공한다.
- 리스트와 같은 반복 가능한(iterable) 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장했는지를 알려준다.
from collections import Counter
counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(counter['blue']) # 'blue'가 등장한 횟수 출력
print(counter['green']) # 'green'이 등장한 횟수 출력
print(dict(counter)) # 사전 자료형으로 반환
실행 결과
3
1
{'red': 2, 'blue': 3, 'green': 1}
최대 공약수와 최소 공배수
import math
def lcm(a, b):
return a*b // math.gcd(a,b)
a = 21
b = 14
print(math.gcd(21, 14)) # 최대 공약수(GCD) 계산
print(lcm(21, 14)) # 최소 공배수(LCM) 계산
실행 결과
7
42