본 게시글은 작성자가 파이썬으로 알고리즘 기초부터 공부하기 위해 나동빈님 유튜브 강의를 보며 선택적으로 정리한 글임.
해당 방법은 실수형으로 표현됨
정수형으로 바꾸려면 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]
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)
리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있음
사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없음
input() 함수는 한 줄의 문자열을 입력 받는 함수
map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용
ex) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용
list(map(int, input().split()))
ex) 공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 단순히 다음과 같이 사용
a, b, c = map(int, input().split())
사용자로부터 입력을 최대한 빠르게 받아야 하는 경우
파이썬의 경우 Sys 라이브러리에 정의되어 있는 sys.stdin.readline()
메서드를 이용
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
키워드
형태만 만들어놓고 아무것도 처리하고 싶지 않을 때
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
키워드로 변수를 지정하면 지역변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조
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강 듣고 나니 그냥 파이썬에 충성해야겠다는 생각뿐