네카라쿠배당토에 갈 꿈을 꾸고 있거나, 프로그래머로서 어디서 말 좀 하고 싶다면 자료구조와 알고리즘을 알아야 한다고 합니다. 흔히 말하는 코딩 테스트가 바로 이 자료구조와 알고리즘을 다루는 능력을 보는 시험입니다.
이 자료구조가 뭐고, 왜 중요하고, 알고리즘이랑 무슨 상관이 있을까요?
⁉️ 자료구조가 뭐야?
어떤 단어가 뭐냐고 물어볼 때 가장 짜증나게 대답하는 방법은 그 단어를 그대로 반복하는 겁니다. 자료구조는 자료를 구조화하는 방법입니다. 더 자세히는 자료(데이터)를 저장하는 방법입니다. 데이터를 저장하는 방법이 왜 그렇게 중요할까요? 그 이유는 세상에는 다양한 종류의 데이터가 있는데 컴퓨터는 기본적으로 모든 자료를 1차원으로 저장하기 때문입니다. 예를 들어체스판도 일종의 데이터라고 할 수 있는데, 체스판은 보통 어떻게 저장할까요?
체스판을 보통 그린다고 하면 가로 세로를 나눠서 2차원 공간에 말을 배치하겠죠? 이렇게 그리는게 자연스럽고, 이해하기도 쉽습니다. 하지만 컴퓨터는 0과 1일 차례대로 저장하는 기계일 뿐이기 때문에 공간이란 개념이 없습니다. 그래서 컴퓨터가 체스 말을 저장할 때에는 이 체스 말을 차례대로 나열할 뿐입니다. 뿐만 아니라, 컴퓨터는 다른 데이터도 저장해야 하기 때문에 우리가 저장할 데이터만큼의 공간을 메모리에 미리 주어야 합니다. 그래서 컴퓨터는 체스판의 크기를 미리 알아야 한다. 이렇게 크기가 정해진 자료구조를 배열이라고 하고, 모든 자료구조는 배열을 바탕으로 두고 거기에 접합한 연산을 빨리 하기 위한 추가 데이터를 같이 저장하는 겁니다.
2. 자료구조가 중요한 이유
사실, 컴퓨터가 자료를 저장하는 방식은 정해져 있다. 우리가 2차원 자료구조를 만들면, 컴퓨터가 자료를 2차원으로 저장하는 것이 아니라, 컴퓨터는 여전히 1차원으로 자료를 저장하는데, 우리가 2차원으로 다룰 뿐이다. 그렇다면 자료구조를 사용하는 의미가 뭘까?
적절한 자료구조를 사용하면 크게 3가지의 좋은 점이 있다.
🐜 1. 똑같은 알고리즘도 어떤 데이터 구조를 사용하는지에 따라 효율성이 달라진다
모든 자료구조가 같은 효율성을 가지고 있는 것은 아니다. 예를 들어, 배열은 배열 안에 있는 자료를 불러오는게 매우 빠르다. 그에 반해 연결 리스트 같은 경우는, n번째 자료에 접근하기 위해 1번부터 모든 데이터를 걸쳐서 가야 하기 때문에 느리다. 그렇기 때문에 자료에 자주 접근해야 하는데 연결 리스트를 쓴다면 효율이 낮아질 것이다. 반대로, 연결 리스트는 새로운 데이터를 빠르게 추가할 수 있지만, 배열은 추가할 수 없다.
🐜 2. 데이터를 관리하는데 도움이 된다
선착순으로 무언가를 처리하는 상황은 자주 있는 일이다. 수강신청은 버튼을 빨리 누른 순서대로 진행되고, 티케팅 또한 마찬가지이다. 이런 순서대로 무언가를 처리하는 코드를 짠다면, 물론 배열을 사용해서 짤 수도 있다. 하지만 매우 복잡하고, 가장 앞 쪽이 아닌 데이터를 처리하거나 하는 오류가 있을 수 있다. 하지만, 큐(Queues)라는 자료구조를 쓰면 훨씬 효율적으로 이러한 데이터를 관리할 수 있다. 큐(Queues)는, 추가는 뒤에만 할 수 있고, 제거는 앞에만 할 수 있는 자료구조이다. 이러한 특성 때문에, 큐(Queues)를 사용한다면 애초에 맨 뒤에 있는 데이터를 불러올 수 없다.
🐜 3. 코드가 더 깔끔해지고, 쉽게 이해할 수 있게 된다
앞에서 큐를 사용하면 순서대로 처리해야 하는 데이터를 효율적으로 관리할 수 있다고 했다. 적절한 자료구조를 사용하면 뿐만 아니라, 코드가 깔끔해지고, 쉽게 이해할 수 있게 된다. 자료구조를 배우지 않고 당장 이를 느끼는 것은 어렵지만, 앞으로 다양한 자료구조에 익숙해지면 자연스럽게 깨닫게 될 것이다.
개미야... 꼭 알아야 하는 자료구조만 알려줘라...
- 배열(Array), 가변배열(Dynamic Array), 연결 리스트(Linked List)
- 큐(Queue), 스택 (Stack)
- 그래프(Graph), 트리(Tree), 힙(Heap)
자료구조, 알고리즘을 좋아해 더 알아가고 싶다면...
- 유니온 파인드 (Union Find)
'CS 이론 > 🤖 알고리즘, 자료구조' 카테고리의 다른 글
코딩 테스트 속도 높이기 : 내가 자주 쓰는 Java 문법 설탕(Syntax Sugar) 총정리 (0) | 2022.12.14 |
---|---|
가변 배열(Dynamic Array), 리스트(List) (0) | 2021.05.28 |
모든 자료구조는 배열(Array)로 통한다 (0) | 2021.05.24 |
추상 자료형(Abstract Data Type)을 왜 알아야 할까 (0) | 2021.05.22 |
빅 오 표기법(Big-O Notation), 알고리즘의 효율을 알려줘 (0) | 2021.05.20 |