자료구조의 개념은 이름 그대로 자료(data)의 구조를 의미하고 있습니다. 이는 데이터를 특정 구조나 형태로 저장하여 해당 데이터를 접근, 추가, 삽입, 수정, 삭제할 수 있도록 하는 "데이터 저장/관리의 전반적인 개념"을 의미합니다.
데이터를 저장하는 방법과 관리하는 방법에 따라 작업의 효율성이 달라집니다. 때문에 해당 작업에 맞는 효율적인 데이터 저장 방식을 찾아야 합니다.
작업의 특징에 따라 데이터의 순서를 보장할 것인지, 데이터의 중복을 허용할 것인지, 데이터의 접근/검색이 효율적인지, 데이터의 유지보수가 쉬운지를 고려하여 데이터 구조를 설계해야 합니다.
대표적인 자료구조의 예시
- 배열(Array)
- 데이터의 순서를 보장하고 중복을 허용
- 세트(Set)
- 데이터의 순서를 보장하지 않고 중복을 허용하지 않음( + 집합의 연산 가능)
- 딕셔너리(Dictionary)
- 데이터의 순서를 보장하지 않고 중복을 허용
- 튜플(Tuple)
- 서로 다른 타입의 데이터를 하나로 묶을 때 사용
- 스택(Stack)
- 먼저 들어온 데이터가 가장 마지막에 나가는 구조
- 큐(Queue)
- 먼저 들어온 데이터가 가장 먼저 나가는 구조
알고리즘은 "어떠한 문제를 해결하는 다양한 방법"을 의미하고 있습니다.
다양한 방법??
알고리즘은 데이터의 형태와 구조에 따라 다양한 방법으로 문제를 해결할 수 있습니다.
(알고리즘은 자료구조와 밀접한 관계를 가지고 있음)
또한 알고리즘을 구현할 때는 "시간복잡도"와 "공간복잡도"를 생각하면서 코드를 작성해야 합니다.
두 복잡도 중에서는 시간복잡도가 더 중요합니다. 공간복잡도는 메모리 공간(하드웨어)과 관련 있으며, 시간복잡도는 작업의 처리 시간(소프트웨어)과 관련 있습니다.
하드웨어의 성능이 좋지 못했던 과거에는 몇 안 되는 메모리 공간이 중요했지만, 하드웨어의 성능이 발전한 현재에는 메모리 공간이 넉넉하므로 메모리 공간의 중요성이 많이 떨어졌습니다. (부족한 경우에는 금전적인 방법으로 충분하게 공간을 확보할 수 있습니다) 하지만 작업의 처리 시간은 물리적인 방법으론 해결할 수 없으므로 시간복잡도의 중요성이 상대적으로 더 큽니다.
시간복잡도의 효율성을 계산할 때는 "빅오 표기법(Big-O notation)"을 활용!!
알고리즘은 문제의 특징과 자료구조에 따라 다양한 방법이 존재합니다.
- 정렬 알고리즘
- 데이터를 순서대로 나열하는 알고리즘
- 문자열 알고리즘
- 문자열 다루는 알고리즘
- 브루트 포스 알고리즘
- 모든 경우의 수를 검사하는 알고리즘
그 외에도 상황에 따라 사용되는 다양한 알고리즘이 존재합니다.