2023.10.12
에피소드 22. 자료구조와 알고리즘은 필수라고?
에피소드 23. 배열이 뭐죠?
에피소드 24. 알고리즘의 속도는 어떻게 표현할까?
에피소드 25. 검색 알고리즘이 뭐죠?
1️⃣
이부자리 정리
2️⃣
씻기
3️⃣
옷입기
4️⃣
커피 내리기
5️⃣
가방 챙기기
6️⃣
집 나서기
출근이나 등교 준비를 빠르게 할 수 있는 방법들이 있듯이, 알고리즘 중에도 더 좋은 알고리즘이 있다.
예) 지도앱
- 목적지까지의 최단 거리 및 시간을 안내해주는 알고리즘 : 패스파인더(pathfinder) 알고리즘
예) PNG, JPG
- 이미지 손상을 최소화하면서 용량은 줄여주는 알고리즘 : 이미지 압축(compression) 알고리즘
데이터 = oil(원유)
인공지능은 데이터 없이 아무 일도 시작 못한다. 일단 원유인 데이터가 있어야 가공을 하든 정리를 하든 뭐든 할 수 있다. 근데 이런 데이터가 정리가 되어 있으면 원하는 데이터를 쉽고 빠르게 찾을 수 있다.
택배회사의 창고에 짐이 정리되어 있어야 시간 내에 고객에게 배달을 하고, 방에 물건이 잘 정리되어 있어야 필요한 물건을 빠르게 찾을 수 있듯이, 데이터도 분류 및 정리가 잘 되어 있어야 작업 속도가 빨라진다. 어떤 자료구조를 사용하는지(마치 어떤 방식으로 짐 정리를 하는지)에 따라 프로그램 속도(필요한 물건을 찾는 속도)가 좌우된다.
짐을 정리하는 방식
- 선반 이용하기
- 박스 이용하기
- 서랍 이용하기
- 라벨 붙히기
자료구조 방식
- 데이터를 크기 기준으로(데이터를 작은 것 부터 큰 순서로) 정리하는 자료구조 방식
- 검색을 위해 인덱스 기준으로(이름표를 붙여서) 정리하는 자료구조 방식
- 생성 시간 기준으로(데이터가 들어오는 순서로) 정리하는 자료구조 방식
어떤 자료구조를 필요로 하는지는 프로그램 마다 다르기 때문에 목적에 맞는 자료구조 방식을 쓰면 된다.
메모리는 컴퓨터의 기억 공간을 의미한다. 마치 기억 창고.
종류
- 휘발성 메모리: 컴퓨터 끄면 데이터 모두 날아감
- 램(RAM, random access memory): 전원 off시, 물건(기억)을 잃어버릴 수 있는 창고
- 창고에 물건을 잠시 저장해 뒀다가 전원 off시 상자가 다 사라지는 것과 같다.
- 램은 데이터에 접근하는 속도가 매우 빠르다.
- 비휘발성 메모리: 휘발성 메모리의 반대
- 하드 드라이브(C,D 드라이브)
번호가 적인 상자들이 나열된 것
배열의 특징을 알려면 배열의 읽기(read), 검색(search), 추가(add), 삭제(delete) 과정에서의 시간복잡도(time complexity)를 알아야한다.
배열을 만들 때는 배열의 길이를 컴퓨터에게 알려줘야 한다.
"길이가 4인 배열을 램에 할당해줘."
🟰"박스 4개를 붙여서 창고에 놓아줘.
배열의 맨 처음 박스 번호는 0이다. 0번째 박스가 첫 박스다.
✔️ 램이 속도가 빠른 이유?
램 안에는 번호가 적힌 상자들이 나열되어 있고 각 상자안에는 데이터를 1개씩 저장할 수 있다.
각 상자의 번호를 보고 "4번 상자에 있는 데이터를 봐"라고 명령함으로써 빠르게 상자를 찾을 수 있다.
✔️ '검색'은 '읽기' 보다 시간이 더 필요하다.
만약 "몇번째 상자를 봐"가 아닌 "피자를 찾아"라고 검색한다면? 배열에서 박스 안의 데이터를 모두 확인해야 하기 때문에 시간이 오래 걸린다. 그래서 검색은 읽기 보다 시간이 더 걸린다. 만약 운 좋게 0번째 박스에 피자가 있다면 검색이 바로 끝나겠지만, 가장 마지막 상자 안에 피자가 있었거나 혹은 처음부터 피자가 아무데도 없었다면 시간은 시간대로 걸리고 피자는 못찾을 것이다.
✔️ 배열에 데이터를 삽입하는 원리와 속도
토마토를 추가하고 싶다고 가정해보자.
배추 | 감자 | 당근 | 파 | 토마토 |
---|
배추 | 감자 | 토마토 | 당근 | 파 |
---|
✔️ 배열에서 데이터를 삭제하는 원리와 속도
배추 | 감자(❌) | 당근 | 파 |
---|
⬇️ 감자 삭제 후 당근과 파를 한칸씩 앞으로 당기기.
배추 | 당근 | 파 |
---|
데이터를 삭제할 때 맨 마지막에 데이터를 삭제할 때 제일 쉽고 맨 앞에 있는 데이터를 삭제할 때 제일 어렵다.
✔️ 배열의 원리
시간복잡도는 작업 속도를 의미한다. 시간 복잡도는 '준비~시작!'과 같이 실제 시간을 재는 것이 아니라 작업이 얼마나 많은 단계를 거치는지
를 측정한다. 어떤 작업을 하는데 있어 어떤 코드는 5단계, 다른 코드는 20단계를 거친다면 5단계를 거치는 코드가 시간 복잡도가 적은 코드라고 할 수 있다.
알고리즘으로 작업을 완료할 때 까지 걸리는 단계 수 N을 이용해서 ,과 같이 표현하는데 이를 빅오(Big-O) 표기법이라고 한다.
def print_first(arr):
print(arr[0])
배열의 길이와 상관없이 이 함수는 딱 한번 실행되고 끝나기 때문에 시간복잡도가 이다.
'시간 복잡도 '은 '상수 시간(constant time)내에 실행된다'는 말로도 표현한다.
def print_first(arr):
print(arr[0])
print(arr[0])
Big-O는 실행 단계에 영향을 주는 요소만 보기 때문에 이 경우에도 시간 복잡도는 이다.
def print_all(arr):
for n in arr:
print(n)
시간 복잡도는
def print_twice(arr):
for n in arr:
for x in arr:
print(x,n)
시간 복잡도는
어떤 알고리즘을 선택하는지에 따라 작업 속도에 엄청난 차이가 생긴다.
검색
하는 알고리즘데이터의 정렬이 끝난 배열
에서만 사용할 수 있다. 즉, 이진 검색 알고리즘을 사용하고 싶다면 배열은 항상 정렬되어 있어야 한다. 12345 또는 54321 같이 순서대로 정렬된 데이터. 34251같은 데이터에서는 안됨.요즘 카카오톡 클론코딩을 하면서 HTML,CSS에만 빠져 지냈는데 역시 개발자라면 알고리즘과 자료구조 쪽을 그냥 넘어갈 수 없는 것 같다. 시간이 걸리더라도 나중에 다시 봤을 때도 이해가 갈 정도로 정리하고 꼭 명확히 짚고 넘어가려고 한다.
m13465님: 중요한 부분에 하이라이트를 주셔서 눈에 잘 보였습니다.
psm3560님: 깔끔하게 잘 정리되어 핵심을 잘 볼 수 있었습니다.
summereuna님: '알고리즘은 보통 대기업 면접 볼 때 꼭 쳐야 하는 시험 느낌이 강했는데 이렇게 재밌는지는 꿈에도 몰랐다'는 표현이 인상깊었습니다.