CodingTest

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

취업하고싶다! 2023. 10. 22. 00:20

파이썬의 자료형

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

 

 

정수형

정수를 다루는 자료형

양의 정수, 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