코딩 테스트 출제 경향 분석 및 파이썬 문법 부수기

Juhee Kim·2024년 6월 24일
0

본 게시글은 작성자가 파이썬으로 알고리즘 기초부터 공부하기 위해 나동빈님 유튜브 강의를 보며 선택적으로 정리한 글임.

알고리즘 성능 평가


수 자료형

  • 해당 방법은 실수형으로 표현됨

  • 정수형으로 바꾸려면 a = int(1e9)

실수형 반올림


리스트 자료형

리스트 = 배열 = 테이블

# 크기가 N이고, 모든 값이 0인 1차원 리스트 초기화
n = 10
a = [0] * n
print(a)

a= [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 뒤에서 세 번째 원소 출력: 인덱싱
print(a[-3])

# 두 번째 원소부터 네 번째 원소까지: 슬라이싱(:) 사용
print(a[1 : 4]) # 결과: [2, 3, 4]

리스트 컴프리헨션

# 0부터 9까지의 수를 포함하는 리스트
array = [i for i in range(10)]
print(array)
# 결과: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

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

# 1부터 9까지의 수들의 제곱 값을 포함하는 리스트
array = [i * i for i in range(1, 10)]

# N X M 크기의 2차원 리스트 초기화
n = 4
m = 3
array = [[0] * m for _ in range(n)] # 길이가 m인 리스트를 n개 만든다.
print(array)
# 결과: [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

💡 언더바는 언제 사용하나요?

리스트 관련 기타 메서드

a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5} # 집합 자료형 (집합 자료형은 추후에 다시 다릅니다.)

# remove_list에 포함되지 않은 값만을 저장
result = [i for i in a if i not in remove_set]
print(result)
# 결과: [1, 2, 4]

문자열 자료형

  • 리스트와같이 인덱싱, 슬라이싱 가능 but, 변경은 불가능(immutable)

튜플 자료형

  • 리스트와 비슷 but, 변경은 불가능
  • 리스트에 비해 상대적으로 공간 효율적
array = [('홍길동', 50), ('이순신', 32), ('아무개', 74)]

튜플을 사용하면 좋은 경우

  • 서로 다른 성질의 데이터를 묶어서 관리해야 할 때

    • 최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용합니다.
  • 데이터의 나열을 해싱(Hashing)의 키 값으로 사용해야 할 때

    • 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있습니다.
  • 리스트보다 메모리를 효율적으로 사용해야 할 때


사전 자료형

  • 키(Key)와 값(Value)의 쌍

  • 순서가 없음

  • 원하는 '변경 불가능한(Immutable) 자료형'을 키로 사용 가능

  • 파이썬의 사전 자료형은 해시 테이블(Hash Table)을 이용하므로 데이터의 조회 및 수정에 있어서 0(1)의 시간에 처리

data = dict()
data['사과'] = 'Apple' # 키 : 값
data['바나나'] = 'Banana'
datal'코코넛'] = 'Coconut'

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

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

# 각 키에 따른 값을 하나씩 출력
for key in key_list:
print(data[key])

집합 자료형

  • 중복을 허용하지 않음

  • 순서가 없음

  • 리스트 혹은 문자열을 이용해서 초기화 가능

    • set() 함수 이용
  • 혹은 중괄호 안에 각 원소를 콤마(,)를 기준으로 구분하여 삽입함으로써 초기화 가능

  • 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있습니다.

# 집합 자료형 초기화 방법 1
data = set([1, 1, 2, 3])

# 집합 자료형 초기화 방법 2
data = {1, 1, 2, 3}

# 새로운 원소 추가
data.add(4)

# 새로운 원소 여러 개 추가
data.update([5, 6])

# 특정한 값을 갖는 원소 삭제
data.remove(3)
a = set([1, 2, 3, 4, 5])
b = set([3, 4, 5, 6, 7])

# 합집합
print(a l b)

# 교집합
print(a & b)

# 차집합
print(a - b)

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

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

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

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

기본 입출력

자주 사용되는 입력 방법

  • input() 함수는 한 줄의 문자열을 입력 받는 함수

  • map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용

    • ex) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용
      list(map(int, input().split()))

    • ex) 공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 단순히 다음과 같이 사용
      a, b, c = map(int, input().split())

빠르게 입력 받기

  • 사용자로부터 입력을 최대한 빠르게 받아야 하는 경우

  • 파이썬의 경우 Sys 라이브러리에 정의되어 있는 sys.stdin.readline() 메서드를 이용

    • 단, 입력 후 엔터(Enter)가 줄 바꿈 기호로 입력되므로 rstrip() 메서드를 함께 사용: data = sys.stdin.readline().rstrip()

자주 사용되는 출력 방법

  • 자동 줄바꿈을 원하지 않는 경우
    print(1, end=" ")

  • 정수형을 문자열과 함께 출력하는 경우
    print(정답은 + str(answer) + "입니다."
    or
    print(f"정답은 {answer}입니다.") (f-string)


조건문과 반복문

조건문

if score >= 90:
    print("학점: A")
elif score >= 80:
    pass # 나중에 작성할 소스코드
else:
    print("학점: F")

💡 in 연산자와 not in 연산자
다수의 데이터를 담는 자료형을 위해 사용한다.
리스트, 튜플, 문자열, 딕셔너리 모두에서 사용 가능

💡 pass 키워드
형태만 만들어놓고 아무것도 처리하고 싶지 않을 때

조건문 편의성 제공

  • 조건문 간소화: if ~ else문을 한줄에 작성
  result = "Success" if score ›= 80 else "Fail"
  • 다른 언어와는 다르게 수학적 부등식 사용 가능
  if 0 < x < 20:
      print("×는 0 이상 20 미만의 수입니다.")

반복문

  • while
  while i <= 9:
      result += i
      i += 1
  • for
  array = [9, 8, 7, 6, 5]
  for x in array:
      print(x)

  # 연속적 값 순회 시 range(시작 값, 끝 값 + 1)
  for i in range(1, 10):
      result += i

💡 for i in range(1, 11)for i in range(10)의 반복 횟수는 동일


함수

def add(a, b):
    print('함수의 결과: ', a + b)
    
add (3, 7)
# 파라미터의 변수 직접 지정 시 매개변수의 순서 달라도 ok
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

💡 값을 변경하지 않고 단순 참조만 하는 경우, global 키워드 없이 참조 가능

a = 10
def func():
    print(a)
func()
# 결과: 10

💡 전역변수로 선언된 리스트 객체의 내부 메소드도 global 키워드 없이 사용 가능

array = [1, 2, 3, 4, 5]
def func():
    array.append(6)
print(array)
func()
# 결과: [1, 2, 3, 4, 5, 6]

여러 개의 반환 값

파이썬 함수는 여러 개의 반환 값을 가질 수 있음

def operator(a, b):
    add_var = a + b
	subtract_var = a - b
	multiply_var = a * b
	divide_var = a / b
	return add_var, subtract_var, multiply_var, divide_var
    
a, b, c, d = operator (7, 3)
print(a, b, c, d)

람다 표현식

이름 없는 함수: 함수를 간단하게 작성 가능
사용 방식: print((lambda 지역변수 : return값)(매개변수))

# 일반적인 add() 메서드 사용
def add(a, b):
	return a + b

print(add(3, 7))


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

내장 함수에서 자주 사용됨.
ex) sorted 함수에서 key 속성은 정렬 기준. 함수로 정렬 기준 선언 가능

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

def my_key (x) :
	return x[1]
    
print(sorted(array, key=my_key))
# x 배열의 두번째 요소, 즉 나이를 기준으로 정렬하겠다. 위와 동일한 작업
print(sorted(array, key=lambda x: x[1]))

여러 개의 리스트에 적용

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

# a와 b에 대해 a+b를 반환하는 함수 정의(lambda), 이것을 list1과 list2에 적용(map) - 원소를 확인하며 각 위치에 맞는 결과가 담김 
result = map(lambda a, b: a + b, listl, list2)

print(list(result))

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

자주 사용되는 내장 함수

순열과 조합

itertools의 라이브러리 사용

그 외


느낀 점

쇼킹하다.
내가 C언어로 순열, 조합 구현하느라 얼마나 힘들었는데 🚬🫠
솔직히 강의 들으면서도 '그냥 익숙한 C언어로 알고리즘 풀까...' 싶었지만 1강 듣고 나니 그냥 파이썬에 충성해야겠다는 생각뿐

profile
개: 개롭지만 발: 발전하는중

0개의 댓글