코딩테스트 전 파이썬 기초 문법 정리

ungnam·2025년 2월 11일

리스트 컴프리헨션

# 0부터 9까지의 수를 포함하는 리스트
array = [i for i in range(10)]

print(array) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 0부터 9까지의 수 중 홀수만을 포함하는 리스트
array = [i for i in range(10) if i % 2 == 1]

print(array) # [1, 3, 5, 7, 9]

2차원 배열에서 적용하려면?

# n * m 크기의 2차원 리스트 초기화
n = 4
m = 3
array = [[0] * m for _ in range(n)]
print(array) # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

# 잘못된 방법
array = [[0] * m] * n
array[1][1] = 5
print(array) # [[0, 5, 0], [0, 5, 0], [0, 5, 0], [0, 5, 0]]

🤔 왜 값 변경이 모든 행에 반영되는 걸까?

[[0] * m] * n을 실행하면, [[0] * m]이라는 리스트가 먼저 생성됨.
이후, 이 리스트를 n번 반복하여 새로운 리스트를 만든 것처럼 보이지만, 실제로는 같은 리스트 객체를 n번 참조하는 형태가 됨.
따라서, array[1][1] = 5로 특정 위치를 변경하면, 모든 행의 동일한 위치가 함께 변경됨.

이를 해결하려면 리스트 컴프리헨션을 통해 내부 리스트를 개별적으로 생성해야 함.

리스트에서 특정 값을 가지는 원소 모두를 제거하는 방법

remove() 메서드의 경우 리스트에서 처음 등장하는 특정 값 하나만 제거하기 때문에, 이 경우에도 리스트 컴프리헨션을 사용하여 간단히 해결할 수 있음.

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]

튜플

리스트와 유사하지만 아래와 같은 특징을 가진다.

  • 변경 불가능(Immutable) → 요소 추가, 삭제, 변경 ❌
  • 소괄호 ( ) 사용
  • 리스트에 비해 상대적으로 공간 효율적이다.

튜플을 사용하면 좋은 경우

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

딕셔너리

키(key)와 값(value)의 쌍으로 이루어진 자료구조

  • 키는 중복 불가능, 값은 중복 가능
  • 키는 변경 불가능(immutable)한 자료형만 사용 가능 (문자열, 숫자, 튜플 등)
  • 값은 변경 가능(mutable)하며, 리스트, 튜플, 딕셔너리도 포함 가능

딕셔너리를 사용하면 좋은 경우

  • 키를 기반으로 데이터를 빠르게 조회해야 할 때 (O(1) 시간 복잡도)
  • 데이터를 키-값 쌍으로 관리해야 할 때 (예: JSON 형태)
  • 리스트보다 검색 속도가 중요한 경우

집합

  • 중복 불가능
  • 순서 없음 (Unordered) → 인덱싱 ❌, 슬라이싱 ❌
  • 변경 가능 (Mutable) → 요소 추가/삭제 가능
    리스트, 튜플을 집합으로 변환 가능
  • 합집합, 교집합, 차집합 등의 연산이 가능

집합을 사용하면 좋은 경우

  • 데이터에서 중복을 자동으로 제거하고 싶을 때
  • 두 개 이상의 데이터에서 공통 요소를 찾거나 비교할 때
  • 순서가 필요하지 않고, 빠른 검색이 필요할 때 (O(1) 시간 복잡도)

기본 입출력

자주 사용하는 입출력 방식 - input()map() 함께 사용하기

# 여러 개의 정수 입력받기
nums = list(map(int, input("숫자들을 입력하세요: ").split()))
print(nums)

# 숫자들을 입력하세요: 10 20 30 40
# [10, 20, 30, 40]

# 만약 데이터의 개수가 정해져 있다면?
a, b, c = map(int, input("숫자들을 입력하세요: ").split())
print(a, b, c)

# 숫자들을 입력하세요: 10 20 30
# 10 20 30

빠르게 입력받으려면?

import sys

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

람다 표현식

간단한 함수를 한 줄로 표현할 때 사용하는 익명 함수

print((lambda a, b: a + b)(3, 7))

람다를 사용하면 좋은 경우

✔ 간단한 연산을 할 때 (map(), filter(), sorted()와 함께!)

array = [('A', 50), ('B', 32), ('C', 74)]
print(sorted(array, key=lambda x: x[1], reverse=True))
# [('C', 74), ('A', 50),('B', 32)]
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]

✔ 함수를 한 번만 사용할 경우 (익명 함수로 사용)

코딩 테스트에서 유용한 표준 라이브러리

  • 내장 함수: 기본 입출력 함수부터 정렬 함수 까지 기본적인 함수들을 제공
    • sum(), min(), max(), eval(), sorted() 등
  • itertools: 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공
    • 특히 순열과 조합 라이브러리는 코딩 테스트에서 자주 사용됨
    • 순열: 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나열하는 것
    • 조합: 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 것
  • heapq: 힙 자료구조를 제공
    • 일반적으로 우선순위 큐 기능을 구현하기 위해 사용
  • bisect: 이진 탐색 기능을 제공
  • collections: 덱, 카운터 등의 유용한 자료구조를 포함
    • Counter: 원소의 등장 횟수를 세는 기능 제공
  • math: 필수적인 수학적 기능을 제공
    • 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함
profile
꾸준함을 잃지 말자.

0개의 댓글