코드 테라피

Python 입문: 파이썬 자료구조와 알고리즘 한방에 정리하기

밍키스튜디오 2023. 7. 31. 23:00
반응형

목차

  1. 소개
  2. 리스트 (List)
    • 리스트 생성하기
    • 리스트의 인덱싱과 슬라이싱
    • 리스트의 기본 연산
    • 리스트의 추가, 수정, 삭제
  3. 튜플 (Tuple)
    • 튜플 생성하기
    • 튜플의 인덱싱과 슬라이싱
    • 튜플과 리스트의 차이점
  4. 딕셔너리 (Dictionary)
    • 딕셔너리 생성하기
    • 딕셔너리의 기본 연산
    • 딕셔너리의 추가, 수정, 삭제
  5. 세트 (Set)
    • 세트 생성하기
    • 세트의 기본 연산
    • 세트의 추가, 삭제
  6. 조건문과 반복문
    • if문
    • for문
    • while문
  7. 검색 알고리즘
    • 선형 검색
    • 이진 검색
  8. 정렬 알고리즘
    • 버블 정렬
    • 선택 정렬
    • 삽입 정렬
    • 퀵 정렬
  9. 재귀 함수
    • 팩토리얼 계산
    • 피보나치 수열
  10. 자주 사용되는 내장 함수
    • 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!

반응형