bonggyulim 님의 블로그
파이썬 기본 문법 본문
1. 출력과 변수
변수 선언
a = 10
name = "Python"
is_ok = True
파이썬은 자료형을 미리 선언하지 않아도 된다.
출력
print(a)
print(name)
print(a, name)
f-string
문자열 안에 변수를 넣을 때 자주 쓴다.
name = "봉규"
age = 27
print(f"이름은 {name}이고, 나이는 {age}살입니다.")
2. 기본 자료형
2-1. 숫자형
a = 10 # int
b = 3.14 # float
사칙연산:
print(10 + 3) # 13
print(10 - 3) # 7
print(10 * 3) # 30
print(10 / 3) # 3.333...
print(10 // 3) # 3 -> 몫
print(10 % 3) # 1 -> 나머지
print(10 ** 3) # 1000 -> 거듭제곱
2-2. 문자열
s = "hello"
# 인덱스
# 0 1 2 3 4
# h e l l o
인덱싱
print(s[0]) # h
print(s[-1]) # o 맨 끝
슬라이싱
# s[start:end:step]
print(s[0:2]) # he 2번 인덱스 전까지
print(s[:3]) # hel
print(s[2:]) # llo 2번 인덱스부터 끝까지
print(s[::-1]) # olleh
문자열 자주 쓰는 함수
s = " hello python "
print(s.strip()) # 양쪽 공백 제거
print(s.upper()) # 대문자
print(s.lower()) # 소문자
print(s.replace("python", "java"))
print(s.split()) # 공백 기준 분리
문자열 합치기:
arr = ["a", "b", "c"]
print("".join(arr)) # abc
코테에서 join()은 매우 자주 나온다.
2-3. 불리언
flag = True
print(flag) # True
비교 연산:
print(3 > 1) # True
print(3 == 1) # False
print(3 != 1) # True
논리 연산:
print(True and False)
print(True or False)
print(not True)
3. 리스트
가장 많이 쓰는 자료형이다.
arr = [1, 2, 3, 4, 5]
접근
print(arr[0])
print(arr[-1]) # 뒤에서 부터 셈 -1, -2, -3 ...
추가 / 삭제
arr.append(6) # 맨 뒤 추가
arr.insert(1, 10) # 특정 위치에 삽입
arr.pop() # 마지막 원소 제거
arr.remove(3) # 값으로 제거
정렬
arr.sort() # 오름차순
arr.sort(reverse=True) # 내림차순
정렬된 새 리스트 반환:
arr = [3, 1, 2]
new_arr = sorted(arr)
print(new_arr) # [1, 2, 3]
뒤집기
arr.reverse()
개수 세기
arr = [1, 2, 2, 3]
print(arr.count(2)) # 2
리스트 컴프리헨션
코테에서 매우 자주 사용된다.
arr = [i for i in range(5)]
print(arr) # [0, 1, 2, 3, 4]
조건 포함:
arr = [i for i in range(10) if i % 2 == 0]
print(arr) # [0, 2, 4, 6, 8]
2차원 배열 생성:
graph = [[0] * 3 for _ in range(4)]
# [
# [0, 0, 0],
# [0, 0, 0],
# [0, 0, 0],
# [0, 0, 0]
# ]
주의:
graph = [[0] * 3] * 4
이 방식은 내부 리스트가 같은 객체를 참조해서 문제를 일으킬 수 있다.
4. 튜플
변경할 수 없는 자료형이다.
t = (1, 2, 3)
좌표나 값 묶음으로 많이 사용한다.
x, y = (3, 4)
print(x, y)
5. 딕셔너리
키-값 형태로 저장한다.
d = {"a": 1, "b": 2}
print(d["a"]) # 1
추가 / 수정
d["c"] = 3
d["a"] = 10
삭제
del d["b"]
자주 쓰는 함수
print(d.keys())
print(d.values())
print(d.items())
print(d.get("a")) # 키가 없으면 None
print(d.get("x", 0)) # 기본값 0
빈도수 세기 패턴
arr = [1, 2, 2, 3, 3, 3]
count = {}
for x in arr:
count[x] = count.get(x, 0) + 1
print(count) # {1: 1, 2: 2, 3: 3}
코테에서 매우 중요하다.
6. 집합(set)
중복 제거와 빠른 탐색에 사용한다.
s = {1, 2, 3}
추가 / 삭제
s.add(4)
s.remove(2)
포함 여부 확인
print(3 in s) # True
중복 제거
arr = [1, 2, 2, 3, 3]
arr = list(set(arr))
print(arr)
7. 조건문
x = 10
if x > 0:
print("양수")
elif x == 0:
print("0")
else:
print("음수")
삼항 연산식:
a = 10
result = "짝수" if a % 2 == 0 else "홀수"
print(result)
8. 반복문
8-1. for문
for i in range(5):
print(i)
range
range(5) # 0 ~ 4
range(1, 5) # 1 ~ 4
range(1, 10, 2) # 1, 3, 5, 7, 9
8-2. while문
i = 0
while i < 5:
print(i)
i += 1
8-3. enumerate
인덱스와 값을 같이 사용할 때 편하다.
arr = ["a", "b", "c"]
for idx, value in enumerate(arr):
print(idx, value)
9. 함수
def add(a, b):
return a + b
print(add(3, 4))
기본값:
def greet(name="guest"):
print(f"hello, {name}")
여러 값 반환:
def calc(a, b):
return a + b, a - b
x, y = calc(10, 3)
print(x, y)
10. 예외 처리
코테에서는 많이 쓰이지 않지만 기본은 알아두면 좋다.
try:
x = int(input())
except:
print("숫자를 입력하세요")
11. 코딩테스트 입력 처리
입력이 많을 때는 input()보다 sys.stdin.readline()이 빠르다.
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
문자열 개행 제거:
s = input().strip()
12. 코딩테스트에서 자주 쓰는 내장 함수
12-1. map
입력을 정수로 한 번에 변환할 때 자주 사용한다.
arr = list(map(int, input().split()))
12-2. sum
arr = [1, 2, 3, 4]
print(sum(arr)) # 10
12-3. min, max
arr = [5, 2, 8, 1]
print(min(arr))
print(max(arr))
12-4. sorted
arr = [3, 1, 2]
print(sorted(arr))
print(sorted(arr, reverse=True))
key 사용:
words = ["apple", "kiwi", "banana"]
print(sorted(words, key=len))
튜플 정렬:
arr = [(2, 3), (1, 5), (2, 1)]
print(sorted(arr)) # 첫 번째 값 기준, 같으면 두 번째 값 기준
print(sorted(arr, key=lambda x: x[1]))
12-5. abs
print(abs(-5)) # 5
12-6. all / any
arr = [True, True, False]
print(all(arr)) # False
print(any(arr)) # True
12-7. zip
여러 리스트를 묶을 때 사용한다.
a = [1, 2, 3]
b = ["a", "b", "c"]
for x, y in zip(a, b):
print(x, y)
12-8. eval
문자열을 코드처럼 실행해서 위험할 수 있으므로 코테에서는 거의 권장하지 않는다.
알아만 두고 남용하지 않는 것이 좋다.
13. 코딩테스트 필수 라이브러리
13-1. collections
파이썬 코테에서 가장 중요하다고 봐도 된다.
deque
양쪽에서 빠르게 삽입/삭제 가능하다.
BFS에서 거의 필수다.
from collections import deque
q = deque([1, 2, 3])
q.append(4) # 오른쪽 추가
q.appendleft(0) # 왼쪽 추가
q.pop() # 오른쪽 제거
q.popleft() # 왼쪽 제거
BFS 예시:
from collections import deque
q = deque()
q.append(1)
while q:
x = q.popleft()
print(x)
Counter
원소 개수를 자동으로 세어준다.
from collections import Counter
arr = ["a", "b", "a", "c", "a"]
counter = Counter(arr)
print(counter) # Counter({'a': 3, 'b': 1, 'c': 1})
print(counter["a"]) # 3
print(counter.most_common(1)) # [('a', 3)]
defaultdict
키가 없어도 기본값으로 자동 생성된다.
from collections import defaultdict
d = defaultdict(int)
d["a"] += 1
print(d["a"]) # 1
리스트 기본값:
d = defaultdict(list)
d["x"].append(10)
13-2. itertools
순열, 조합 문제에서 자주 사용한다.
from itertools import permutations, combinations, product
permutations
순열
arr = [1, 2, 3]
print(list(permutations(arr, 2)))
combinations
조합
arr = [1, 2, 3]
print(list(combinations(arr, 2)))
product
중복 순열
arr = [1, 2, 3]
print(list(product(arr, repeat=2)))
13-3. heapq
우선순위 큐를 구현할 때 사용한다.
다익스트라, 최소 힙 문제에서 필수다.
import heapq
heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)
print(heapq.heappop(heap)) # 1
print(heapq.heappop(heap)) # 2
최소 힙만 기본 지원한다.
최대 힙처럼 사용:
import heapq
heap = []
heapq.heappush(heap, -3)
heapq.heappush(heap, -1)
heapq.heappush(heap, -2)
print(-heapq.heappop(heap)) # 3
13-4. math
수학 관련 문제에서 유용하다.
import math
print(math.sqrt(16)) # 제곱근
print(math.gcd(12, 18)) # 최대공약수
print(math.lcm(12, 18)) # 최소공배수
print(math.factorial(5)) # 팩토리얼
print(math.ceil(3.1)) # 올림
print(math.floor(3.9)) # 내림
13-5. bisect
이진 탐색을 쉽게 구현할 수 있다.
from bisect import bisect_left, bisect_right
arr = [1, 2, 4, 4, 4, 5, 6]
print(bisect_left(arr, 4)) # 2
print(bisect_right(arr, 4)) # 5
개수 구하기:
count = bisect_right(arr, 4) - bisect_left(arr, 4)
print(count) # 3
14. 자주 나오는 문법 패턴
14-1. 리스트 초기화
visited = [False] * 10
dist = [0] * 10
14-2. 2차원 방향 탐색
DFS/BFS에서 자주 사용한다.
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
14-3. swap
a, b = b, a
14-4. 입력값 여러 개 받기
a, b = map(int, input().split())
14-5. 문자열을 리스트처럼 사용
s = "abcde"
for ch in s:
print(ch)
14-6. 아스키 코드 변환
print(ord('A')) # 65
print(chr(65)) # A
문자 변환 문제에서 자주 나온다.