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