코테를 위한 Python 문법 정리

shin·2022년 7월 16일

Python

목록 보기
3/4

1. 수 자료형

1) 지수 표현 방식

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

  • 1e9라고 입력하면, 10의 9제곱이 됨

    • 유효숫자e^지수 = 유효숫자 X 10^지수
  • 지수 표현 방식은 임의의 큰 수를 표현하기 위해 자주 사용됨

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

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

# 1,000,000,000의 지수 표현 방식
a = 1e9
print(a) # 실수로 출력 1000000000.0
print(int(a)) # 정수로 출력 1000000000

a = 75.25e1
print(a) # 752.5

a = 3954e-3
print(a) # 3.954

2) 실수형

  • IEEE754 표준에서는 실수형을 저장하기 위해 4바이트, 혹은 8바이트의 고정된 크기의 메모리를 할당하므로, 컴퓨터 시스템은 실수 정보를 표현하는 정확도에 한계를 가짐
  • 10진수 체계에서는 0.3과 0.6을 더한 값이 0.9로 정확하게 떨어짐
  • 하지만 2진수에서는 0.9를 정확히 표현할 수 있는 방법이 없음
  • 컴퓨터는 최대한 0.9와 가깝게 표현하지만, 미세한 오차가 발생함
a = 0.3 + 0.6
print(a)

if a == 0.9:
  print(True)
else:
  print(False)
0.8999999999999999
False
  • 개발 과정에서 실수 값을 제대로 비교하지 못해서 원하는 결과를 얻지 못할 수 있음
  • round() 함수를 이용하는 방법이 권장됨
a = 0.3 + 0.6
print(round(a, 4))

if round(a, 4) == 0.9:
  print(True)
else:
  print(False)
0.9
True

3) 수 자료형의 연산

  • 나누기 연산자(/) : 나눠진 결과를 실수형으로 반환
  • 나머지 연산자(%)
    • a가 홀수인지 체크하는 로직 설계시 활용
  • 몫 연산자(//)
  • 거듭 제곱 연산자(**)
a = 10
b = 3
print(a / b, a % b, a // b, a ** b)
3.3333333333333335 1 3 1000

2. 리스트 자료형

1) 리스트 초기화

  • 크기가 10인 리스트의 모든 값을 0으로 초기화
n = 10
a = [0] * n
print(a)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

2) 리스트 comprehension

  • 0부터 9까지의 수를 포함하는 리스트
array = [i for i in range(10)]
array2 = list(i for i in range(10))
print(array)
print(array2)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 0부터 19까지의 수 중에서 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]
print(array)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
  • 리스트 comprehension은 2차원 리스트를 초기화할 때 효과적으로 사용
  • N X M 크기의 2차원 리스트를 한 번에 초기화
N = 2
M = 3
array = [[0] * M for _ in range(N)]
print(array)

array[1][1] = 2
print(array)
[[0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 2, 0]]
  • 위 for문에서 사용된 언더바(_)
    : 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 사용함

3) 리스트 관련 메서드들의 시간 복잡도

  • append() : O(1)
  • sort() : O(NlogN)
    • 기본은 오름차순, reverse = True 설정 시 내림차순 정렬
  • reverse() : O(N)
  • insert(삽입할 위치 인덱스, 삽입할 값) : O(N)
  • count(특정 값) : O(N)
  • remove(특정 값) : O(N)
    • 특정 값을 가진 원소가 여러 개면 하나만 제거

3. 튜플 자료형

1) 튜플 특징

  • 튜플은 한 번 선언된 값을 변경할 수 없음
  • 튜플은 소괄호(())를 이용함
  • 튜플은 리스트에 비해 상대적으로 공간 효율적임
a = (1, 2, 3)
print(a[1], a[-1])
a[1] = 2
2 3
Traceback (most recent call last):
  File "DataStructure/test.py", line 3, in <module>
    a[1] = 2
TypeError: 'tuple' object does not support item assignment

2) 튜플을 사용하면 좋은 경우

  • 서로 다른 성질의 데이터를 묶어서 관리할 때
    • 최단 경로 알고리즘에서는 (비용, 노드번호)의 형태로 튜플 자료형을 주로 사용함
  • 데이터의 나열을 Hashing의 키 값으로 사용해야 할 때
    • 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있음
  • 리스트보다 메모리를 효율적으로 사용해야 할 때

4. 사전 자료형

  • 사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형
    • 리스트나 튜플이 값을 순차적으로 저장하는 것과는 대비됨
  • 변경 불가능한(immutable) 자료형을 키로 사용할 수 있음
  • 파이썬의 사전 자료형은 해시 테이블을 이용
    • 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리 가능
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'

key_list = data.keys() # 키 데이터만 담은 리스트
value_list = data.values() # 값 데이터만 담은 리스트

print(key_list)
print(value_list)
print(data)
dict_keys(['사과', '바나나'])
dict_values(['Apple', 'Banana'])
{'사과': 'Apple', '바나나': 'Banana'}

5. 집합 자료형

1) 집합 특징

  • 중복을 허용하지 않음
  • 순서가 없음
  • 리스트 혹은 문자열을 이용해서 초기화할 수 있음
  • 중괄호 안에 각 원소를 콤마를 기준으로 구분하여 삽입함으로써 초기화할 수 있음
  • 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있음
array = [1, 2, 2, 3, 4, 3]
data = set(array)
print(array)
print(data)
[1, 2, 2, 3, 4, 3]
{1, 2, 3, 4}

2) 집합 자료형의 연산

  • 합집합, 교집합, 차집합
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}

6. 자료형별 조회 기능 비교

  • 리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있음
  • 사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없음
    • 사전의 키 혹은 집합의 원소를 이용해 O(1)의 시간 복잡도로 조회 가능

7. 기본 입출력

1) 표준 입력

  • input() : 한 줄의 문자열을 입력 받는 함수
  • map() : 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용
# 데이터 개수 입력
n = int(input())
# 각 데이터를 공백을 기준으로 구분하여 입력
data = list(map(int, input().split()))

data.sort(reverse = True) # 크기가 큰 순서대로 정렬
print(data)
5
75 80 69 88 97
[97, 88, 80, 75, 69]
# a, b, c를 공백을 기준으로 구분하여 입력
a, b, c = map(int, input().split())
print(a, b, c)
2 10 4
2 10 4

2) 빠르게 입력 받기

  • sys 라이브러리에 정의되어 있는 sys.stdin.readline() 메서드 이용
  • 단, 입력 후 엔터가 줄 바꿈 기호로 입력되므로 rstrip() 메서드를 함께 사용함
import sys

data = sys.stdin.readline().rstrip() # 문자열 입력 받기
print(data)

3) 표준 출력

print(1, 2, sep = ",")
print(3, end = " ")
print(4)
1,2
3 4

4) f-string

answer = 10
print(f"정답은 {answer}입니다.")

8. 조건문

1) 조건부 표현식

  • if ~ else 문을 한 줄에 작성
score = 95
result = "Success" if score >= 80 else "Fail"
print(result)
Success

9. for문

  • 학생들의 합격 여부 판단 예제 (단, 특정 번호의 학생은 제외)
scores = [90, 85, 77, 65, 97]
cheating_student_list = {2, 4}

for i in range(len(scores)):
  if i + 1 in cheating_student_list:
    continue
  if scores[i] >= 80:
    print(i + 1, "번 학생은 합격입니다")
  else:
    print(i + 1, "번 학생은 불합격입니다")
1 번 학생은 합격입니다
3 번 학생은 불합격입니다
5 번 학생은 합격입니다

10. 함수와 람다 표현식

1) global 키워드

  • global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 됨
array = [1, 2, 3, 4, 5] # 전역 변수

def func(a):
  array = [3, 4, 5] # 지역 변수
  array.append(a)
  return array

print(array)
print(func(6))
print(array)
[1, 2, 3, 4, 5]
[3, 4, 5, 6]
[1, 2, 3, 4, 5]
  • global 키워드로 선언된 변수를 변경할 때
array = [1, 2, 3, 4, 5] # 전역 변수

def func(a):
  global array 
  array = [3, 4, 5] # 전역 변수 변경
  array.append(a)
  return array

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

2) 람다 표현식

  • 특정 기능을 수행하는 함수를 한 줄에 작성 가능
print((lambda a, b : a + b)(3, 7)) # 10
  • 내장 함수에서 자주 사용되는 람다 함수
array = [('lee', 100), ('kim', 76), ('park', 98)]

def my_key(x):
  return x[1]

print(sorted(array, key = my_key))
print(sorted(array, key = lambda x : x[1]))
print(sorted(array, key = lambda x : -x[1]))
[('kim', 76), ('park', 98), ('lee', 100)]
[('kim', 76), ('park', 98), ('lee', 100)]
[('lee', 100), ('park', 98), ('kim', 76)
  • 여러 개의 리스트에 적용
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]

result = map(lambda a, b: a + b, list1, list2)
print(list(result))

result = map(lambda a: a**2, list1)
print(list(result))
[7, 9, 11, 13, 15]
[1, 4, 9, 16, 25]

11. 표준 라이브러리

1) itertools

  • 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공함

  • 순열과 조합 라이브러리는 코딩 테스트에서 자주 사용됨

  • 순열 : 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열

from itertools import permutations, combinations

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')]
  • 조합 : 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택
from itertools import permutations, combinations

data = ['A', 'B', 'C']

result = list(combinations(data, 3))
print(result)
[('A', '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')]

2) heapq

  • heap 자료 구조를 제공
  • 일반적으로 우선순위 큐 기능을 구현하기 위해 사용됨

3) bisect

  • binary search 기능을 제공

4) collections

  • deque, Counter 등의 유용한 자료 구조를 포함
  • Counter : 등장 횟수를 세는 기능 제공
  • 리스트와 같은 반복 가능한 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장했는지 알려줌
from collections import Counter

colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
counter = Counter(colors)
print(counter['blue']) # 'blue'가 등장한 횟수 출력
print(counter['green']) # 'green'이 등장한 횟수 출력
print(dict(counter)) # 사전 자료형으로 반환
3
1
{'red': 2, 'blue': 3, 'green': 1}

5) math

  • 필요한 수학적 기능 제공
  • 팩토리얼, 제곱근, 최대 공약수, 삼각 함수 관련 함수부터 파이와 같은 상수를 포함함
  • 최대 공약수를 구할 때 gcd() 함수를 이용할 수 있음
import math

def lcm(a, c): # 최소 공배소를 구하는 함수
  return a * b // math.gcd(a, b)

a = 21
b = 14

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

출처 : 이것이 취업을 위한 코딩 테스트다 with 파이썬

profile
Backend development

0개의 댓글