본문 바로가기
알고리즘/자료구조

1. 자료구조란?

by D.O.T 2024. 1. 26.
Data Structure

컴퓨터는 Data의 집합체입니다. 컴퓨터에서 Data를 다루기 위한 방법이 있겠죠?

실제로 사람이 생각하기에 직관적이거나 수학적, 논리적으로 해결할 수 있는 사고를 컴퓨터의 입장에서 표현한 것이 자료구조입니다.

컴퓨터는 사람과 다르게 생각을 할 수 없기 때문에 이해할 수 있도록 '명령'을 해주어야 합니다.

 

How ? 

 

어떻게 컴퓨터에게 명령을 해야 할까요?

기본적으로 컴퓨터는 변수에 값을 할당하고 입, 출력을 통해 우리가 확인할 수 있습니다.

이 때, 1, 2, 3, 4, 5, 7 이 있을 때 '6'을 추가하는데 순서를 유지하고 싶습니다.

즉, 결과를 1 2 3 4 5 6 7로 나타내고 싶습니다.

 

방법은 무수히 많은데요.

vector<int> arr = {1, 2, 3, 4, 5, 7};
int now = 6;

for (int index = 0; index < arr.size(); index++) {
    int key = arr[index];
    if (key > now) {
    	arr[index] = now;
        now = key;
    }
}

 

위와 같은 코드가 있다고 생각해 봅시다.

단순한 논리로는 현재 값이 key 값보다 클 경우, 삽입하고 현재값을 key 값으로 바꾸게 됩니다.

(1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (7, 6)을 비교하다가 7 > 6인 시점에서 arr은 {1, 2, 3, 4, 5, 6}이 되고 now는 7이 됩니다.

어 ? 7을 삽입할 수 없지 않나요?

vector<int> arr = {1, 2, 3, 4, 5, 7};
int now = 6;

for (int index = 0; index < arr.size(); index++) {
    int key = arr[index];
    if (key > now) {
    	arr[index] = now;
        now = key;
    }
}

arr.push_back(now);

 

그래서 우리는 마지막에 push_back을 추가하게 되면 나보다 큰 값이 없을 경우, 당연히 맨 마지막에 추가하게 되므로 문제가 없는 코드가 됩니다.

근데, 처음부터 key값이 now값보다 작은 경우는 어떻게 될까요?

위 코드에서 now를 0이라고 해봅시다. 직접 실행해보면 문제없이 잘 된다는 것을 알 수 있습니다! 

 

이렇게 하나의 숫자를 추가하는 것도 생각해야 할 부분이 많습니다..

우리는 매번 코드를 작성할 때, 이렇게 많은 부분까지 생각해야할까요?? (정답)

이 많은 부분을 조금이나마 줄일 수 있고 빠르게 접근할 수 있는게 자료구조의 개념입니다.

 

위의 코드는 하나의 전제 조건이 필요합니다.

이전에 미리 '정렬'되어 있어야 한다.

그럼 우리는 매번 정렬에 대해 생각해야할까요..?

자료구조를 사용하면 내가 따로 정렬하지 않더라도 정렬이 되도록 할 수 있습니다.

 

그 외, 현실세계에서 생각할 수 있는 지도, 사람간의 관계, 컴퓨터의 동작 등....

우리가 컴퓨터에 명령할 때 컴픂터도 이해하기 쉽고 인간의 번거로움도 줄여주는 것이 자료구조입니다.

 

컴퓨터 언어를 접해봤다면 `이것들로 어떻게 웹 사이트, 앱, 게임 등이 만들어지는 것 일까?`

한 번이라도 이런 생각을 해봤다면 자료구조가 그렇게 어렵게 느껴지지는 않을 것이라고 생각합니다.

물론 깊이 공부할수록 어려운 것은 당연하나 일정한 수준까지는 어렵기 힘들다고 봅니다.


저는 자료구조를 공부할 때, `아 이게 이렇게 엮이구나~` 를 계속 생각해봤습니다.

 

자료구조의 시작을 작성하는 글인데 처음부터 너무 두루뭉술한 글이네요.

자료구조를 시작할 때, 가장 필요한 것이 '어디에 사용되느냐?', '왜 사용되느냐?', '어떻게 사용되느냐?'

위 세가지가 핵심인 것 같아서 많은 내용을 제외하고 작성해봤습니다.

 

자료 구조의 종류와 사용처

 

자료 구조의 종류는 정말 많습니다. 많다보니 제대로 이해하지 못하는 사람들도 많은데요.

대학 동기들 중에서도 자료구조와 알고리즘의 구분을 제대로 못하는 사람들도 많더군요.

보통 사용하는 프로그래밍 언어에서 import 해야 사용할 수 있는 인스턴스들은 자료구조라고 보시면 됩니다.

C++의 경우, STL에 포함된 set, queue, unordered_map 등이 있습니다.

STL과 같이 자료구조를 '어떠한' 자료구조의 개념을 사용해서 만든 자료구조 또한 있습니다.

 

자료구조 종류

 

배열, 스택, 큐(덱), 연결 리스트, 힙(우선순위 큐), 해시테이블, 트리 (이진 탐색트리, 균형이진 트리, 완전 이진트리), 그래프 (인접행렬, 인접리스트, Disjoint Set), 트라이

 

사용처

 

각 각의 사용처는 정말 많은데요.

운영체제, 네트워크만 해도 우선순위 큐 and 큐 and 그래프 and 배열 and 해시테이블, ... 등

앞으로 작성할 포스팅에서 자료구조에 언제 사용하면 좋을 지도 한 번 생각해서 작성해보겠습니다.