본문 바로가기
CodingTest

코딩테스트 준비 - 파이썬 문법 정리

by 취업하고싶다! 2023. 10. 22.

파이썬의 자료형

정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 사전

 

 

정수형

정수를 다루는 자료형

양의 정수, 0, 음의 정수가 포함

 

 

실수형

소수점 아래의 데이터를 포함하는 수 자료형

소수부가 0일 때 0 생략 가능

 

 

지수 표현 방식

파이썬에서는 e나 E를 이용한 지수 표현 방식 이용

e, E 다음에 오는 수는 10의 지수부를 의미

ex) 1e9 -> 10의 9제곱(1,000,000,000). 1 x 10^9

 

최단 경로 알고리즘에서는 도달할 수 없는 노드에 대해 최단 거리를 무한(INF)로 설정하곤 함

이때 가능한 최댓값이 10억 미만이라면 무한(1NF)의 값으로 1e9를 이용할 수 있음

# 1,000,000,00의 지수 표현 방식
a = 1e9
print(a)	// 1000000000.0

#752.5
b = 75.25e1
print(b)	// 725.5

# 3.954
c = 3954e-3
print(c)	// 3.954

 

 

리스트 컴프리헨션

리스트를 초기화하는 방법 중 하나

대괄호 안에 조건문과 반복문을 적용해 리스트 초기화

arr = [i for i in range(10)]
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

리스트 컴프리헨션은 2차원 리스트를 초기화할 때 효과적으로 사용

N x M 크기의 2차원 리스트 초기화

arr = [[0] * m for _ in range(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 = (1, 2, 3, 4, 5, 6, 7, 8, 9)

# 4번째 원소만 출력
print(a[3])	// 4

# 두 번째 원소부터 4번째 원소까지 출력
print(a[1:4])	// (2, 3, 4)

 

 

튜플을 사용하면 좋은 경우

1. 서로 다른 성질의 데이터를 묶어서 관리할 때 - 최단 경로 알고리즘에선(비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용

2. 데이터의 나열을 해싱의 키 값으로 사용해야 할 때 - 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있음

3. 리스트보다 메모리를 효율적으로 사용해야 할 때

 

 

 

사전 자료형

키(key)와 값(value)의 쌍을 데이터로 가지는 자료형 - 변경 불가능한 자료형을 키로 사용할 수 있음

앞서 다뤘던 리스트나 튜플이 값을 순차적으로 저장하는 것과 대비

파이썬의 사전 자료형은 해시 테이블을 이용하므로 데이터 조회, 수정에 있어서 O(1) 시간에 처리 가능

 

keys() 함수: 키 데이터만 뽑아서 리스트로 이용

values() 함수: 값 데이터만 뽑아서 리스트로 이용

data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'

print(data)	// {'사과': 'Apple', '바나나': 'Banana', '코코넛': 'Coconut'}

key_list = data.keys()
value_list = data.values()

print(key_list)	// dict_keys(['사과', '바나나', '코코넛'])

 

 

집합 자료형

집합의 특징: 중복 허용 x, 순서 x

 

초기화 방법

1. 리스트 혹은 문자열을 이용해서 초기화(set() 함수)

2. 중괄호({}) 안에 각 원소를 콤마를 기준으로 구분해 삽입해 초기화

 

데이터 조회, 수정에 있어 O(1)의 시간에 처리 가능

# 초기화 방법 1
data = set([1, 1, 2, 3, 4, 4, 5])
print(data)	// {1, 2, 3, 4, 5}

# 초기화 방법 2
data = {1, 1, 2, 3, 4, 4, 5}
print(data)	// {1, 2, 3, 4, 5}

기본적인 집합 연산: 합집합, 교집합, 차집합

a = set([1, 2, 3, 4, 5])
b = set([3, 4, 5, 6, 7])

# 합집합
print(a | b)	// {1, 2, 3, 4, 5, 6, 7}

# 교집합
print(a & b)	// {3, 4, 5}

# 차집합
print(a - b)	// {1, 2}

집합 자료형 관련 함수

data = set([1,2,3])

# 새 원소 추가
data.add(4)
print(data)	// {1,2,3,4}

# 여러 개 추가
data.update([5,6])
print(data)	// {1,2,3,4,5,6}

# 특정 값 갖는 원소 삭제
data.remove(3)
print(data)	// {1,2,4,5,6}

 

 

사전 자료형과 집합 자료형의 특징

리스트, 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값 얻을 수 있음

하지만 사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값 얻을 수 없음

사전의 키 혹은 집합의 원소를 이용해 O(1)의 시간 복잡도로 조회

 

 

빠르게 입력 받기

sys 라이브러리에 정의되어 있는 sys.stdin.readline() 메서드 사용

단, 입력 후 엔터가 줄 바꿈 기호로 입력되므로 rstrip() 메서드 함께 사용

import sys

data = sys.stdin.readline().rstrip()

 

 

 

 

자주 사용되는 표준 출력 방법

print()는 기본적으로 출력 이후 줄바꿈 수행 - 원치 않는 경우 end 속성 사용

 

f-string: 문자열 앞에 접두사 f를 붙여 사용

answer = 7
print(f"정답은 {answer}이다")	// 정답은 7이다

 

 

파이썬의 pass 키워드

아무것도 처리하고 싶지 않을 때 pass 키워드 사용

ex) 디버깅 과정에서 일단 조건문의 형태만 만들어놓고 조건문을 처리하는 부분은 비워놓고 싶은 경우

score = 80

if score > 80:
    pass
else:
    print("성적이 낮다")

 

반복문 예제

// 특정 번호 학생 제외

scores = [90, 85, 77, 65, 97]
cheating_std_list = {2, 4}

for i in range(5):
    if i+1 in cheating_std_list:
        continue
    if scores[i] >= 80:
        print(i+1, "번 학생은 합격")

// 1 번 학생은 합격
// 5 번 학생은 합격

 

 

함수 정의 - global 키워드

global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고 함수 바깥에 선언된 변수를 바로 참조

a = 0

def func():
    global a
    a += 1

for i in range(10);
    func()
    
print(a)    // 10

 

전역변수로 리스트가 선언되면 리스트 객체의 내부 메서드 호출은 오류없이 수행 가능

하지만 함수 내에 전역변수와 같은 이름의 지역변수가 선언되면 함수 내에서는 지역변수가 우선적으로 참조됨!

arr = [1,2,3,4,5]

def func():
    arr.append(6)
    print(arr)

func()	// [1,2,3,4,5,6]


def func2():
    arr = [3,4,5]
    arr.append(6)
    print(arr)

func2()	// [3,4,5,6]

 

 

람다 표현식

함수 간단하게 작성 가능

특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점이 특징

def add(a, b):
    return a+b

# 일반적인 add() 메서드 사용
print(add(3,7))

# 람다 표현식으로 구현한 add() 메서드
print((lambda a, b: a+b)(3,7))

 

ex) 점수순으로 오름차순으로 출력하기

arr = [('홍길동', 50), ('이순신', 32), ('아무개', 74)]

def my_key(x):
    return x[1]

print(sorted(arr, key=my_key))		// [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
print(sorted(arr, key=lambda x: x[1])	// [('이순신', 32), ('홍길동', 50), ('아무개', 74)]

 

ex) 여러 리스트에 적용

list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]

result = map(lambda a, b: a+b, list1, list2)
print(list(result))	// [7,9,11,13,15]

 

 

실전에서 유용한 표준 라이브러리

내장 함수: 기본 입출력부터 정렬 함수까지 기본적인 함수 제공

itertools: 반복되는 형태의 데이터를 처리하기 위한 유용한 기능 제공(순열, 조합 라이브러리는 코테에서 자주 사용)

heapq: 힙 자료구조 제공(우선순위 큐 기능을 구현하기 위해 사용)

bisect: 이진 탐색 기능 제공

collections: 덱(deque), 카운터(Counter) 등의 유용한 자료구조 포함

math: 필수적인 수학적 기능 제공(팩토리얼, 제곱근, 최대공약수(GCD) 등등...)

 

 

 

순열과 조합

순열(nPr): 서로 다른 n개에서 서로 다른 r개를 선택해 일렬로 나열

ex) {'a', 'b', 'c'} 에서 3개를 선택해 나열: 'abc', 'acb' 'bac'. 'bca', 'cab'. 'cba'

 

조합(nCr): 서로 다른 n개에서 순서에 상관없이 서로 다른 r개 선택

ex) {'a', 'b', 'c'} 에서 순서 고려 않고 2개 뽑는 경우: 'ab', 'ac', 'bc'

# 순열
import itertools from permutations

data = ['a', 'b', 'c']
result = list(permutations(data, 3))


# 조합
import itertools from combinations

result2 = list(combinations(data, 3))

 

중복 순열과 중복 조합

from itertools import product

data = ['a', 'b', 'c']
result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기(중복 허용)
print(result)


from itertools import combinations_with_replacement

data = ['d', 'e', 'f']
result2 = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기(중복 허용)
print(result2)

 

 

Counter

등장 횟수를 세는 기능

리스트와 같은 반복 가능한 객체가 주어졌을 때 내부 원소가 몇 번씩 등장했는지 알려줌

from collections import Counter

counter = Counter(['red', 'red', 'blue', 'blue', 'blue', 'green'])

print(counter['blue'])	# 3
print(dict(counter)	# 사전 자료형으로 변환 {'red': 2, 'blue': 3, 'green': 1}

 

 

 

최대공약수와 최대공배수

math 라이브러리의 gcd() 함수

import math

# 최소 공배수(LCM)
def lcm(a,b):
    return a * b // math.gcd(a,b)

a = 21
b = 14

print(math.gcd(21, 14)	# 최대공약수(gcd) 계산 - 7
print(lcm(21, 14)	# 최소공배수(lcm) 계산 - 42