자료형
#소수부가 0일 때 0을 생략
a = 5. # 5.0
# 10억의 지수 표현 방식 (최단 경로문제에서 자주 사용)
a = 2e+9+1
# 컴퓨터는 2진수 체계이기 때문에 실수 덧셈을 정확히 하지 못한다. 보통 5째 자리에서 반올림 하면된다.
a = 0.3 + 0.6
print(rount(a,4))
수 자료형의 연산
a = 7
b = 3
# 나누기
a / b
# 나머지
a % b
# 몫
a // b
# 거듭 연산자
a ** b # a의 b승
자료형 변환
# 문자열을 한 글자씩 분리하여 리스트에 저장
str = 'Hello world!'
list = list(str)
['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!']
# Java에서 다음과 같은 코드는 ch 에 'b'를 저장한다.
# 하지만 파이썬은 문자를 아스키코드를 나타내는 int형으로 변환하고 연산한 뒤 다시 char형으로 형변환 해주어야 한다.
char ch = 'a'+1; # 자바
ch = chr(ord('a')+1) # 파이썬
입력
input() 보다는, sys 라이브러리에서 제공하는 sys.stdin.readline() 를 사용하자.
Java 에서는 Scanner 나 System.out.println 보다는 BufferedReader 를 써야하고, Python 에서는 input() 대신 sys 라이브러리의 sys.stdin.readline() 을 권장한다. input() 함수는 사용자의 입력을 받아 문자열로 변환시키는 과정이 필요하지만,
sys.stdin 의 경우 사용자의 입력을 Buffer 에 저장한 후 요청이 올때마다 읽는다.
주의할 점은, readline 의 경우 개행문자 \n 까지 받아온다는 점이다. 따라서 이를 제거하고 싶다면 strip() 함수를 추가로 실행해주어야 한다.
import sys
input = sys.stdin.readline
# N개의 정수를 한 줄로 입력 받았을 경우
N, M, K = map(int, input().split())
# N개의 정수를 한 줄로 입력 받아 List에 저장할 경우
data = list(map(int, input().split()))
# N개의 정수를 여러 줄에 걸쳐 입력 받아 List에 저장할 경우
N = int(input())
data = [int(input()) for _ in range(N)]
# N개의 문자열을 여러 줄에 걸쳐 입력 받아 List에 저장할 경우 <- 중요!(문자열의 뒤에 \n 제거하기 위해 .strip() 추가)
N = int(input())
data = [input().rstrip() for _ in range(N)]
# N개의 정수를 여러 줄에 걸쳐 입력 받아 이차원 배열에 저장할 경우.
N = int(input())
matrix = [list(map(int, input().split())) for _ in range(N)]
출력
띄어쓰기로 된 여러 변수 출력하기
a,b,c = 1,2,3
# 띄어쓰기로 된 여러 변수를 출력하는 법
print(a,a,a)
# 콜론 ':' 기호를 사이에 두고 값을 출력 (sep 는 분류기호(seperator)를 의미)
print(a,b, sep=":") # 출력 : 1:2
# print(..., end=' ') 와 같이 작성하면 값 출력 후 공백문자 ' '를 출력한다. 즉, 마지막에 줄을 바꾸지 않고 빈칸만 띄운다.
print(a,end=' ')
print(b,end=' ') # 출력 : 1 2
# f-string 방식
# 파이썬 3.6 이상 부터 지원하는 방식이다. 가장 가독성이 좋고 가장 빠르다고 알려져 있다.
# 출력할 문자열 앞에 f나 F를 붙이면 사용할 수 있다. { } 안에는 출력할 변수가 직접 들어간다. (연산도 가능)
month = 1
day = 10
print(f'2020년 {month}월 {day}일')
# Boolean 값 출력
print(a<b) #True
print(not (a<b)) #false
# 2진수, 8진수, 16진수
# 앞에 '0b'와 같은 걸 빼고 싶으면 #을 삭제하기
# 대문자로 출력하고 싶을시 b->B 대문자로 변경
print(format(a,'#b')) //10진수 -> 2진수
print(format(a,'#o')) //10진수 -> 8진수
print(format(a,'#x')) //10진수 -> 16진수
value = 0b1100100 #예시 2진수
print(format(value,'#d')) //2진수 -> 10진수
진수&유니코드
맨날 헷갈려하는 진수 변환 깔끔하게 외우도록 하자
10진수 -> 2진수, 8진수, 16진수
# 2진수 변환
bin(42) #'0b101010'
# 8진수 변환
oct(42) #'0o52'
# 16진수 변환
hex(42) #'0x2a'
2진수, 8진수,16진수 -> 10진수
# 2진수
int('0b101010', 2) #42
# 8진수
int('0o52', 8) #42
# 16진수
int('0x2a', 16) #42
연산자
비교 연산자
# 비교 연산자
x == y
x != y
x > y
x < y
x >= y
x <= y
# 논리 연산자
x and y
x or y
not x # x가 거짓일 때 참이다.
문자열
문자열 연산
a = "Hello"
b = "World"
a + " " + b # Hello World
a * 3 # HelloHelloHello
# 파이썬 문자열은 내부적으로 리스트와 같이 처리 (인덱싱,슬라이싱) 사용 가능
a = "ABCDEF"
a[2:4] #CD
튜플 자료형
- 튜플은 한 번 선언된 값을 변경할 수 없다.
- 리스트는 대괄호[] 를 이용하지만 , 튜플은 소괄호 ()를 이용한다
- 그래프 알고리즘을 구현할 때 자주사용
- 다익스트라 최단 경로 알고리즘 (우선순위큐 사용)
- (비용,노드번호) 형태로 튜플을 묶어서 관리한다.
- 다익스트라 최단 경로 알고리즘 (우선순위큐 사용)
a = (1, 2, 3, 4)
a[2] = 7 # TypeError
사전 자료형
사전 자료형 소개
- key와 value의 쌍을 데이터로 가지는 자료형
- 튜플 자료형이 사전자료형의 키로 사용되는 경우 (Q 22 블록이동하기)
- 사전 자료형에 특정한 원소가 있는 지 검사할 때는 '원소 in 사전'의 형태를 사용할 수 있다.
- 리스트나 튜플에 대해서도 사용할 수 있는 문법
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
# {'사과': 'Apple', '바나나': 'Banana', '코코넛': 'Coconut'}
data = {'사과': set([1,2]),
'바나나':set([3,4]),
'코코넛':set([5,6])}
# {'사과': {1, 2}, '바나나': {3, 4}, '코코넛': {5, 6}}
if '사과' in data:
print("'사과'를 키로 가지는 데이터가 존재합니다.")
사전 자료형 관련 함수
- 자료를 삭제 하고 싶을시 del(dict['사과'])함수를 사용한다.
- 자료를 삭제 + 반환 시 pop('사과') 함수를 사용한다.
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
del(dict['사과']) # data 에서 사과 삭제
data = dict.pop('사과') # data에서 사과 삭제 및 반환
key_list = data.keys() # 키 데이터만 담은 리스트
value_list = data.values()
//안에 있는 값을 가져올 수 있다.
for key in data:
print(data[key])
사전 자료형의 value를 리스트로 만들고 추가하는 법
from collections import defaultdict
graph = defaultdict(list)
for ticket in tickets:
graph[ticket[0]].append(ticket[1])
해쉬를 이용한 갯수 세기
hash_map = {}
for name, type in clothes:
hash_map[type] = hash_map.get(type, 0) + 1
집합 자료형(Set)
집합 자료형 소개
- 중복을 허용하지 않는다
- 순서가 없다
- 특정한 데이터가 이미 등장한 적이 있는지 여부를 체크할 때 효과적이다.
집합 자료형의 연산
# 집합 자료형 초기화 방법
a = set([1,2,3,4,5])
b = {3,4,5,6,7}
a | b # 합집합 {1,2,3,4,5,6,7}
a & b # 교집합 {3,4,5}
a - b # 차집합 {1,2}
집합 자료형 관련 함수
data = set([1,2,3])
print(data)
# 새로운 원소 추가
data.add(4)
# 새로운 원소 여러 개 추가
data.update([5,6])
# 특정한 값을 갖는 원소 삭제
data.remove(3)
print(data)
리스트
1차원 리스트 초기화 및 인덱싱
a = [1,2,3,4,5,6,7,8,9]
# 빈 리스트 선언 방법
a = list()
a = []
# 크기가 N이고 모든 값이 0인 1차원 리스트 초기화
n = 10
a = [0] * n # [0,0,0,0,0,0,0,0,0,0]
# 인덱싱
a = [1,2,3,4,5,6,7,8,9]
a[-1] # 9
a[-3] # 7
a[1:4] # [2,3,4]
# 1부터 100까지 리스트 만들기
a = list(range(100))
# 문자열 -> 리스트 변환
str = "python"
my_list = list(str) # ['p', 'y', 't', 'h', 'o', 'n']
# 리스트 -> 문자열 변환
str_list = ['There', 'is', 4, "items"]
result = ' '.join(map(str, str_list)) # There is 4 items
2차원 리스트 초기화 (리스트 컴프리헨션) (언더바 _ )
# N * M 크기의 2차원 리스트 초기화
n, m = 3, 4
array = [[0] * m for _ in range(n) ] # [[0,0,0,0],[0,0,0,0], [0,0,0,0]]
리스트를 깊은 복사 하는법 (중요)
list1 = [1,2,3]
list2 = list(list1)
list1.append(1)
print(list1) # [1, 2, 3, 1]
print(list2) # [1, 2, 3]
초기화를 할때 중요한 점
아래에서 a배열과 b배열은 변경에서 차이가 있다.
a배열은 *를 이용해서 행렬을 만들면 참조를 복사하기 때문에 [0,0]을 변경하면 [0,0], ~ [10,0] 까지 전부 변경된다.
그러므로 반드시 b와 같이 선언을 해주어야 한다.
a=[[0]*10]*10
b = [[False]*10 for _ in range(10)]
b = [[0]*10 for _ in range(10)]
리스트에 있는 원소와 인덱스를 한번에 가져오는 방법
for i, letter in enumerate(['A', 'B', 'C']):
print(i, letter)
# 0 A
# 1 B
# 2 C
리스트 관련 기타 메소드
a = [1,4,3]
# 리스트 길이 구하기
len(a)
# 리스트에 원소 삽입
a.append(2)
# 리스트에 안에있는 원소 삽입
a.extend([2,5]) # [1, 4, 3, 2, 5]
a.append([2,5]) # [1, 4, 3, [2, 5]]
# 리스트 원소 뒤집기
a.reverse()
# 특정 인덱스에 데이터 추가
a.insert(2,3) # 인덱스2에 3추가
# 특정 값인 데이터 개수 세기
a.count(3)
# 특정 값 데이터 삭제 (인덱스가 낮은 것 하나)
a.remove(1)
# 리스트가 empty인지 확인
list1 = []
list2 = [1,2,3]
if not list1 : print("list1 is empty")
if list2 : print("list2 is not empty")
# 리스트에 어떤 값이 포함되어 있는지 확인
item = 1
if item in list1: print("list1 has no item") //있으면 True 없으면 False
# 리스트안에 있는 값 index 찾기
list1.index(1) # 없으면 오류남
파이썬 슬라이싱
# 기본 형태
a[start : end : step]
# start: 슬라이싱을 시작할 시작위치입니다.
# end: 슬라이싱을 끝낼 위치로 end는 포함하지 않습니다!
# step: stride(보폭)라고도 하며 몇개씩 끊어서 가져올지와 방향을 정합니다.
a = ['a', 'b', 'c', 'd', 'e']
# 특정 시작위치부터 끝까지 가져오기
a[ start : ]
a[ 1 : ] #['b', 'c', 'd', 'e']
a[ -3 : ] #['c', 'd', 'e']
# 시작점부터 특정 위치까지 가져오기
a[ : end ]
a[ : 2 ] # ['a', 'b']
a[ : -1] # ['a', 'b', 'c', 'd']
# 특정 위치부터 특정 위치까지 모두 가져오기
a[ start : end ]
a[ 2 : 4 ] # ['c', 'd']
a[ -4 :-2] # ['b', 'c']
a[ 3 : 0 : -1] # 인덱스 1 ~ 3까지의 값을 거꾸로 가져오기 ['d', 'c', 'b']
# step의 예제
# step이 양수일 때: 오른쪽으로 step만큼 이동하면서 가져옵니다.
# step이 음수일 때: 왼쪽으로 step만큼 이동하면서 가져옵니다.
a[ : : 2 ] # 2칸씩 이동하면서 가져옵니다. ['a', 'c', 'e']
a[ -5 : : 3 ] # 3칸씩 이동하면서 가져옵니다. ['a', 'd']
a[ : : -1 ] # 전체를 거꾸로 가져옵니다. ['e', 'd', 'c', 'b', 'a']
a[ 3 : : -1 ] # ['d', 'c', 'b', 'a']
zip
- 다수의 iterable 객체를 한 번에 iteration할 수 있도록 하는 함수
- 단, 최소 길이의 리스트를 기준으로 한다.
number = [1,2,3]
english = ['a','b','c']
korean = ['ㄱ','ㄴ','ㄷ']
for a,b,c in zip(number, english, korean):
print(a,b,c , end = " ")
알아야 할 문법
함수 안에서 함수 밖의 변수 데이터를 변경해야 하는 경우
a = 0
def func():
global a
a += 1
for i in range(10):
func()
print(a)
'코딩 테스트 > 코딩테스트 - 학습' 카테고리의 다른 글
정렬 (0) | 2023.01.20 |
---|---|
완전 탐색 (0) | 2023.01.18 |
dfs bfs (0) | 2023.01.14 |
코딩 테스트 파이썬 문법 (중간편) (0) | 2023.01.12 |
코딩테스트 준비 (By Python...) (2) | 2023.01.10 |