Python 입문: 파이썬 자료구조와 알고리즘 한방에 정리하기
목차
- 소개
- 리스트 (List)
- 리스트 생성하기
- 리스트의 인덱싱과 슬라이싱
- 리스트의 기본 연산
- 리스트의 추가, 수정, 삭제
- 튜플 (Tuple)
- 튜플 생성하기
- 튜플의 인덱싱과 슬라이싱
- 튜플과 리스트의 차이점
- 딕셔너리 (Dictionary)
- 딕셔너리 생성하기
- 딕셔너리의 기본 연산
- 딕셔너리의 추가, 수정, 삭제
- 세트 (Set)
- 세트 생성하기
- 세트의 기본 연산
- 세트의 추가, 삭제
- 조건문과 반복문
- if문
- for문
- while문
- 검색 알고리즘
- 선형 검색
- 이진 검색
- 정렬 알고리즘
- 버블 정렬
- 선택 정렬
- 삽입 정렬
- 퀵 정렬
- 재귀 함수
- 팩토리얼 계산
- 피보나치 수열
- 자주 사용되는 내장 함수
- map()
- filter()
- reduce()
- lambda 함수
소개
이 블로그는 파이썬의 기본적인 자료구조와 알고리즘에 대해 정리한 내용입니다. 파이썬은 다양한 자료구조를 지원하며, 이러한 자료구조를 효율적으로 활용하는 알고리즘을 학습하는 것은 프로그래밍의 기초 중 하나입니다. 블로그에서는 각 자료구조의 개념을 설명하고, 실제 코드 예제를 통해 파이썬에서 어떻게 활용하는지를 알아보겠습니다.
2. 리스트 (List)
리스트 생성하기
파이썬에서 리스트는 대괄호 [ ]
를 사용하여 생성합니다.
# 빈 리스트 생성
empty_list = []
# 정수형 요소를 가진 리스트 생성
numbers = [1, 2, 3, 4, 5]
# 문자열 요소를 가진 리스트 생성
fruits = ['apple', 'banana', 'orange']
리스트의 인덱싱과 슬라이싱
리스트의 각 요소에 접근하기 위해 인덱싱을 사용합니다. 인덱스는 0부터 시작하며, 음수 인덱스는 뒤에서부터 요소에 접근합니다.
# 인덱싱 예제
print(numbers[0]) # 출력: 1
print(fruits[-1]) # 출력: 'orange'
# 슬라이싱 예제
print(numbers[1:4]) # 출력: [2, 3, 4]
print(fruits[:2]) # 출력: ['apple', 'banana']
리스트의 기본 연산
리스트는 여러가지 유용한 기본 연산을 지원합니다.
# 리스트 길이 구하기
print(len(numbers)) # 출력: 5
# 리스트 결합
combined_list = numbers + fruits
print(combined_list) # 출력: [1, 2, 3, 4, 5, 'apple', 'banana', 'orange']
# 리스트 반복
repeated_list = numbers * 3
print(repeated_list) # 출력: [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
리스트의 추가, 수정, 삭제
리스트에 요소를 추가, 수정, 삭제하는 방법을 알아봅니다.
# 추가
fruits.append('grape')
print(fruits) # 출력: ['apple', 'banana', 'orange', 'grape']
# 수정
fruits[1] = 'kiwi'
print(fruits) # 출력: ['apple', 'kiwi', 'orange', 'grape']
# 삭제
fruits.remove('orange')
print(fruits) # 출력: ['apple', 'kiwi', 'grape']
3. 튜플 (Tuple)
튜플은 리스트와 유사하지만, 한번 생성되면 수정이 불가능합니다. 대괄호 대신 소괄호 ()
를 사용하여 튜플을 생성합니다.
튜플 생성하기
# 빈 튜플 생성
empty_tuple = ()
# 정수형 요소를 가진 튜플 생성
numbers_tuple = (1, 2, 3, 4, 5)
# 문자열 요소를 가진 튜플 생성
fruits_tuple = ('apple', 'banana', 'orange')
튜플의 인덱싱과 슬라이싱
튜플도 리스트와 마찬가지로 인덱싱과 슬라이싱을 지원합니다.
# 인덱싱 예제
print(numbers_tuple[0]) # 출력: 1
print(fruits_tuple[-1]) # 출력: 'orange'
# 슬라이싱 예제
print(numbers_tuple[1:4]) # 출력: (2, 3, 4)
print(fruits_tuple[:2]) # 출력: ('apple', 'banana')
튜플과 리스트의 차이점
튜플과 리스트의 가장 큰 차이점은 튜플은 수정이 불가능하다는 것입니다. 따라서 튜플의 요소를 변경하려고 시도하면 오류가 발생합니다.
fruits_tuple[1] =
'kiwi' # 오류 발생
프로그램에서 수정이 필요 없는 데이터를 사용하거나, 데이터의 불변성을 보장하고 싶을 때는 튜플을 사용합니다.
4. 딕셔너리 (Dictionary)
딕셔너리는 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 자료구조입니다. 중괄호 {}
를 사용하여 딕셔너리를 생성하며, 각 요소는 콜론 :
으로 구분합니다.
딕셔너리 생성하기
# 빈 딕셔너리 생성
empty_dict = {}
# 키와 값의 쌍을 가진 딕셔너리 생성
student_scores = {'Alice': 95, 'Bob': 80, 'Charlie': 90}
딕셔너리의 기본 연산
딕셔너리는 특정 키를 사용하여 값에 접근하고, 새로운 키와 값의 쌍을 추가하거나 삭제할 수 있습니다.
# 값 접근
print(student_scores['Alice']) # 출력: 95
# 새로운 요소 추가
student_scores['David'] = 88
print(student_scores) # 출력: {'Alice': 95, 'Bob': 80, 'Charlie': 90, 'David': 88}
# 요소 삭제
del student_scores['Charlie']
print(student_scores) # 출력: {'Alice': 95, 'Bob': 80, 'David': 88}
5. 세트 (Set)
세트는 중복되지 않는 데이터를 저장하는 자료구조입니다. 중괄호 {}
를 사용하여 세트를 생성하며, 리스트나 튜플과 달리 인덱스를 사용하여 요소에 접근할 수 없습니다.
세트 생성하기
# 빈 세트 생성
empty_set = set()
# 정수형 요소를 가진 세트 생성
numbers_set = {1, 2, 3, 4, 5}
# 문자열 요소를 가진 세트 생성
fruits_set = {'apple', 'banana', 'orange'}
세트의 기본 연산
세트는 합집합, 교집합, 차집합 등의 기본적인 연산을 지원합니다.
# 합집합
combined_set = numbers_set | fruits_set
print(combined_set) # 출력: {1, 2, 3, 4, 5, 'apple', 'banana', 'orange'}
# 교집합
common_elements = numbers_set & fruits_set
print(common_elements) # 출력: set()
# 차집합
difference_set = numbers_set - fruits_set
print(difference_set) # 출력: {1, 2, 3, 4, 5}
6. 조건문과 반복문
파이썬에서 조건문과 반복문을 사용하여 프로그램의 흐름을 제어할 수 있습니다.
if문
# if문 예제
score = 85
if score >= 90:
print('A')
elif score >= 80:
print('B')
else:
print('C')
for문
# for문 예제
fruits = ['apple', 'banana', 'orange']
for fruit in fruits:
print(fruit)
while문
# while문 예제
count = 1
while count <= 5:
print(count)
count += 1
7. 검색 알고리즘
검색 알고리즘은 주어진 데이터에서 특정 값을 찾는 기법입니다.
선형 검색
# 선형 검색 예제
def linear_search(arr, target):
for index, value in enumerate(arr):
if value == target:
return index
return -1
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
target_number = 6
result = linear_search(numbers, target_number)
print(f"Index of {target_number}: {result}")
이진 검색
# 이진 검색 예제
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
sorted_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
target_number = 6
result = binary_search(sorted_numbers, target_number)
print(f"Index of {target_number}: {result}")
8. 정렬 알고리즘
정렬 알고리즘은 데이터를 특정 순서로 정렬하는 기법입니다.
버블 정렬
# 버블 정렬 예제
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
numbers = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(numbers)
print(numbers) # 출력: [11, 12, 22, 25, 34, 64, 90]
선택 정렬
# 선택 정렬 예제
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_index = i
for j in range(i+1, n):
if arr[j] < arr[min_index]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
numbers = [64, 34, 25, 12, 22, 11, 90]
selection_sort(numbers)
print(numbers) # 출력: [11, 12, 22, 25, 34,
64, 90]
삽입 정렬
# 삽입 정렬 예제
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and key < arr[j]:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
numbers = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(numbers)
print(numbers) # 출력: [11, 12, 22, 25, 34, 64, 90]
퀵 정렬
# 퀵 정렬 예제
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
numbers = [64, 34, 25, 12, 22, 11, 90]
numbers = quick_sort(numbers)
print(numbers) # 출력: [11, 12, 22, 25, 34, 64, 90]
9. 재귀 함수
재귀 함수는 함수가 자기 자신을 호출하는 기법을 의미합니다.
팩토리얼 계산
# 팩토리얼 계산 예제
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
result = factorial(5)
print(result) # 출력: 120
피보나치 수열
# 피보나치 수열 예제
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
for i in range(10):
print(fibonacci(i), end=' ')
# 출력: 0 1 1 2 3 5 8 13 21 34
10. 자주 사용되는 내장 함수
파이썬은 많은 내장 함수를 제공하여 프로그래밍을 더욱 편리하게 할 수 있습니다.
map()
# map() 예제
def square(x):
return x ** 2
numbers = [1, 2, 3, 4, 5]
squared_numbers = map(square, numbers)
print(list(squared_numbers)) # 출력: [1, 4, 9, 16, 25]
filter()
# filter() 예제
def is_even(x):
return x % 2 == 0
numbers = [1, 2, 3, 4, 5]
even_numbers = filter(is_even, numbers)
print(list(even_numbers)) # 출력: [2, 4]
reduce()
# reduce() 예제
from functools import reduce
def multiply(x, y):
return x * y
numbers = [1, 2, 3, 4, 5]
product = reduce(multiply, numbers)
print(product) # 출력: 120
lambda 함수
# lambda 함수 예제
numbers = [1, 2, 3, 4, 5]
squared_numbers = map(lambda x: x ** 2, numbers)
print(list(squared_numbers)) # 출력: [1, 4, 9, 16, 25]
결론
이 블로그에서는 파이썬의 기본적인 자료구조와 알고리즘에 대해 간단히 살펴보았습니다. 리스트, 튜플, 딕셔너리, 세트와 같은 자료구조를 사용하여 데이터를 효율적으로 다룰 수 있으며, 검색 알고리즘과 정렬 알고리즘을 통해 데이터를 찾고 정렬할 수 있습니다. 또한 재귀 함수와 내장 함수의 활용법을 익혀보았습니다.
더욱 다양한 알고리즘과 자료구조를 학습하여 프로그래밍 능력을 향상시키길 바라며, 파이썬의 매력적인 기능들을 잘 활용하여 유용한 프로그램을 개발하시기를 기원합니다. Happy coding!