본문 바로가기
코딩 테스트/코딩테스트 - 학습

코딩테스트 파이썬 문법 (기초편)

by 안스 인민군 2023. 1. 12.

자료형

#소수부가 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