자료구조 & 알고리즘
선형 배열(Linear Array)
[특강] 코딩 테스트 & 면접 대비
정렬(Sort) & 탐색(Search)
재귀(Recursive) 알고리즘
알고리즘의 복잡도
자료구조: 데이터와 해당 데이터에 적용할 수 있는 연산의 집합
알고리즘
사전적 정의: 어떤 문제를 해결하기 위한 절차, 방법, 명령어들의 집합
프로그래밍 관점에서의 정의: 주어진 문제의 해결을 위한 자료구조와 연산 방법에 대한 선택
문제마다 최적의 해법이 다르기 때문에 다양한 자료구조와 알고리즘을 아는 것이 중요
배열: 같은 종류의 데이터를 순서대로 나열한 것
파이썬에서는 리스트를 사용
숫자뿐 아니라 모든 타입의 데이터 나열 가능
서로 다른 타입의 데이터도 하나의 리스트에 나열 가능
탐색: index(value)
추가: append() / 추출: pop(index) / 삽입: insert(index, value)
인덱스는 0부터 시작
코딩테스트: 최소한의 문제 해결 능력 검증하기 위해 문제 제시
코딩인터뷰: 직무에 필요한 배경지식을 갖췄는지 검증
코딩 테스트 대비 방법
구현 능력 갖추기
기본적인 자료구조 이해
기초 알고리즘 및 시간/공간 복잡도 이해
현실 문제를 해결하기 위한 알고리즘 적용 해법 착안 사고 훈련
제한 시간 내에 오류 없이 코드 작성 및 디버깅할 수 있는 능력 훈련
-> 결국, 문제를 많이 풀어봐야 함
알고리즘을 외우려고 하지 말고, 생각의 흐름을 이해하고 따라가려고 해야 함
짧은 코드가 빠른 코드를 의미하지 않으며, 작성한 코드가 어떻게 실행되는지 이해해야 함
파이썬 내부적으로 동작하는 방식에 따라 같은 연산도 효율이 다를 수 있음
파이썬 리스트의 정렬
sorted()
내장 함수(built-in function)
정렬된 새로운 리스트 반환
sort()
리스트의 메서드
해당 리스트를 정렬
ls.sort(reverse = True)
ls.sort(key = lambda x : len(x))
문자열로 이루어진 리스트의 경우, 길이 순이 아닌 사전순으로 정렬
선형 탐색(Linear Search)
이진 탐색(Binary Search)
재귀: 하나의 함수에서 자신을 다시 호출해 작업을 수행하는 것
반복적으로 구현 가능한 문제는 재귀적으로도 구현 가능
종료조건(trivial case)을 반드시 정의해야 함
n! 을 구하는 문제는 반복적 혹은 재귀적으로 구현할 경우 시간복잡도가 O(N)이지만, "N(N + 1) // 2" 라는 수식을 이용할 경우 O(1)에 해결 가능
재귀적 기법보다 반복적 기법이 시간복잡도 측면에서 효율적
팩토리얼은 아래와 같이 라이브러리를 통해 간단하게 구할 수 있음
from math import factorial
result = factorial(10)
복잡도: 코드가 얼마나 복잡한지가 아닌 자원을 얼마나 필요로 하는지를 의미
시간 복잡도(Time Complexity)
문제의 크기와 이를 해결하는 데 걸리는 시간 사이의 관계
최선의 경우, 평균, 최악의 경우 중 최악의 경우가 가장 중요
Big-O Notation으로 표현
O(1), O(log N), O(N), ...
공간 복잡도(Space Complexity)