개발로 자기계발
728x90

자료구조

- 데이터를 효율적으로 조직화, 저장 및 관리하기 위한 방법을 제공

예시) 배열(Array)은 데이터를 순차적으로 접근하기에 적합한 자료구조

 

알고리즘

- 어떤 문제를 해결하기 위한 절차나 방법론

- 주어진 문제의 해결을 위한 자료구조와 연산 방법에 대한 선택

 

자료구조와 알고리즘의 관계

- 적절한 자료구조를 선택하면 문제를 해결하는 알고리즘의 성능을 향상

 

선형 배열(Linear Arrays)

- 선형 배열(Linear Array)은 데이터를 일렬로 저장하는 자료구조

- 일반적으로 인덱스를 사용하여 각 요소에 접근할 수 있고 Python에서는 리스트(List)라는 데이터형

- 메모리 상에서 연속된 공간에 데이터를 저장하며, 데이터를 빠르게 접근 가능

- 데이터를 순서대로 저장하며, 인덱스를 사용하기 때문에 원하는 위치에 삽입이나 삭제 간 다른 요소들의 이동 필요

 

Python List 연산

리스트 길이과 관계없이 빠르게 실행 결과를 보게 되는 연산들

- append() - 리스트의 마지막에 요소를 추가

- pop() - 리스트의 마지막의 요소를 추출

 

리스트의 길이에 비례해서 실행 시간이 걸리는 연산들

- insert() - 리스트의 특정 위치에 요소를 추가

ex) list_name.insert(index, value)

- del() - 리스트의 특정 위치의 요소를 삭제

- index() - 리스트의 특정 요소의 위치를 반환

ex) list_name.index(value, start, end)

 

정렬(Sort)

- 주어진 데이터를 일정한 기준에 따라 순서대로 나열하는 것

Python 리스트의 정렬

- sorted() - 내장 함수(원본 리스트는 변하지 않음)

- sort() - 리스트의 메서드(원본 리스트는 변함)

* 기본값은 오름차순 / 내림차순(reverse = True 옵션 추가)

 

sorted안에 key에 lambda를 통해서 정렬 기준을 자유롭게 추가할 수 있다.

sorted(list_name, key=lambda x : x)

 

탐색(Search)

- 주어진 데이터에서 특정 값을 찾는 것

알고리즘 종류

- 선형 탐색(Linear Search): 리스트 길이에 비례하는 시간 소요(표기: O(n))

- 이진 탐색(binary Search): 리스트를 절반씩 분할하여 탐색 범위를 좁혀가며 찾는 알고리즘(표기: O(log n))

* 리스트가 이미 정렬되어있어야 함.

코드 예시)

def binary_search(list_, x):
    # 리스트의 인덱스 범위를 저장
    low, high = 0, len(list_) - 1
    
    # low와 high 변수가 교차할 때까지 반복
    while low <= high:
        # 리스트의 중앙에 위치한 인덱스를 계산
        mid = (low + high) // 2
        
        # 중앙값이 찾고자 하는 값과 같은 경우, 인덱스를 반환
        if list_[mid] == x:
            return mid
        
        # 중앙값이 찾고자 하는 값보다 작은 경우, 오른쪽 절반에 대해 이진 탐색을 수행
        elif list_[mid] < x:
            low = mid + 1
        
        # 중앙값이 찾고자 하는 값보다 큰 경우, 왼쪽 절반에 대해 이진 탐색을 수행
        else:
            high = mid - 1

 

재귀 알고리즘

- 재귀함수(recursive functions): 함수가 자기 자신을 호출하여 문제를 해결하는 것

- 이전 두 항을 더하여 현재 항을 구하는 수열로, 첫 번째 항과 두 번째 항은 각각 0과 1이고, 그 이후의 항은 이전 두 항의 합으로 구해진다.

- 하노이의 탑

- 조합의 수

- 피보나치 순열

코드 예시)

# 재귀함수
def solution(x):
    if x == 0:
        return 0
    elif x == 1:
        return 1
    else:
        return solution(x-1) + solution(x-2)

# 반복문
def solution(x):
    a, b = 0, 1
    for i in range(x):
        a, b = b, a+b
    return a

 

알고리즘의 복잡도

1) 시간 복잡도(Time Complexity): 알고리즘이나 프로그램이 실행되는 동안 소요되는 시간의 양

- 평균 시간 복잡도(Average Time Complexity): 알고리즘의 평균적인 수행 시간

- 최악 시간 복잡도(Worst-case Time Complexity): 알고리즘이 최악의 경우에 얼마나 오래 걸리는지

- Big-O Notation: 알고리즘의 성능을 분석하고 표현하는 방법 중 하나

표기법)

O(1) : 상수 시간 알고리즘
O(log n) : 로그 시간 알고리즘
O(n) : 선형 시간 알고리즘
O(n log n) : 로그 선형 시간 알고리즘
O(n^2) : 이차 시간 알고리즘
O(n^3) : 삼차 시간 알고리즘
O(2^n) : 지수 시간 알고리즘

 

2) 공간 복잡도(Space Complexity): 알고리즘이나 프로그램이 실행되는 동안 소요되는 메모리공간의 양


공부하며 어려웠던 내용

- 재귀함수의 구성과 재귀함수를 for문으로 변환시킬 때

- sorted의 key 조건에 쓰이는 lambda

728x90
SMALL

'Develop > 기초지식' 카테고리의 다른 글

자료구조 & 알고리즘 - 3  (0) 2023.04.12
자료구조 & 알고리즘 - 2  (0) 2023.04.11
코딩 테스트 특강 간단 정리  (0) 2023.04.10
쿠키와 세션의 정의  (0) 2023.01.31
JSON Web Token(JWT)  (0) 2023.01.07
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)