개발을 시작하시는 여러분, 정보가 너무 많고 배워야 할 것도 산더미라 어디서부터 시작해야 할지 막막하신가요? 내일배움캠프 수료생들이 4개월 동안 배운 엄선된 핵심 개념을 직접 정리해서 알려 드립니다. 공부하다 막히거나 헷갈리는 개념이 있다면 개념 콕으로 정리해보세요.
그래프 (Graph)
그래프(Graph)란?
그래프(Graph)는 객체들 사이의 연결 관계를 표현하는 자료구조로, 노드(Node)와 엣지(Edge)의 집합으로 정의됩니다.
그래프 용어 정리
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252Faef5af85-59c9-4df9-9038-ef9d2c506e0b%252FUntitled.png%3Ftable%3Dblock%26id%3D28899f1c-d00d-4253-b282-5964a99cde2c%26cache%3Dv2&w=3840&q=75)
1) Node (노드): 그래프를 구성하고 있는 각각의 요소
2) Edge (간선): 그래프를 구성하기 위해 노드와 노드를 잇는 선
3) Weight (가중치): 노드 간 간선에 소모되는 일정 수치
위와 같은 그래프를 가중치 그래프라고 합니다. 가중치 그래프란 가중치 정보를 두어 구성한 그래프를 의미합니다. 반대는 비가중치 그래프로, 가중치 정보가 없는 그래프를 의미합니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252Ff6318b12-3049-42d7-a4bb-f7d8b537edd4%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_4.35.37.png%3Ftable%3Dblock%26id%3D6a65a78f-0d5e-4da9-9483-270ec54ed6ad%26cache%3Dv2&w=3840&q=75)
또한, 그래프는 방향성에 따라 단방향 그래프(Directed Graph)와 무방향 그래프(Undirected Graph)로 나눌 수 있습니다.
- 단방향 그래프(Directed Graph): 엣지에 방향이 존재하여 노드 간 이동이 한 방향으로만 가능
- 무방향 그래프(Undirected Graph): 엣지에 방향이 없어 양방향 이동이 가능
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252F65cc25e1-d039-48fb-9bd4-422031a7f426%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_4.13.42.png%3Ftable%3Dblock%26id%3D7fef50c2-768b-47e5-b351-a60d65ccde75%26cache%3Dv2&w=3840&q=75)
그래프에서 노드와 엣지 개념을 지도로 생각하면 이해하기 쉽습니다.
정점(노드)은 각 지점을 나타내고, 간선(엣지)은 지점 간의 이동 경로를 나타냅니다. 두 지점 사이에는 여러 개의 이동 경로가 존재할 수 있으며, 각 경로마다 소요되는 시간이 다를 수 있습니다.
그래프의 자료구조
인접 행렬 (Adjacency Matrix)
- 2차원 배열을 사용하여 그래프를 표현하는 방식입니다.
- 행과 열은 노드를 나타내고, 해당 위치의 값은 두 노드 사이의 엣지 존재 여부 또는 가중치를 나타냅니다. 예를 들어 노드에서 나가서 노드으로 들어오는 간선이 있다면 1, 아니면 0으로 인접 행렬을 채웁니다.
- 장점
- 배열에 인덱스로 접근 할 수 있어, 시간 복잡도가 O(1) 입니다.
- 단점
- 노드의 개수가 많고, 엣지가 적은 경우 공간 효율성이 떨어집니다.
- 노드의 개수가 많을 경우 (자바의 경우 3만개 이상) 2차원 배열을 선언 할 수 없습니다.
- 3만 길이가 넘는 2차원 배열을 생성하면 자바에선 힙 스페이스 에러가 발생합니다.노드 개수가 많아질수록 메모리 사용량이 크게 증가합니다. (O(V^2), V: 노드 개수)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252F06a66814-9efb-440c-8b42-31e56dd519a1%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_4.54.38.png%3Ftable%3Dblock%26id%3D0127bd79-477b-4e72-9665-82a98a2c3c92%26cache%3Dv2&w=3840&q=75)
인접 리스트 (Adjacency List)
- 각 노드마다 인접한 노드들을 리스트 형태로 저장하는 방식입니다.
- 연결 리스트, 배열, 해시 테이블 등의 자료구조를 사용하여 구현할 수 있습니다.
- 장점: 노드의 개수가 많아져도 공간 효율이 좋아서 메모리 초과 에러가 발생하지 않습니다.
- 단점
- 구현이 복잡합니다.
- 인덱스로 접근 할 수 없어, 원소를 순회하며 돌아야하기 떄문에 최악의 경우 O(N) 의 시간 복잡도를 가질 수 있습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252F3012f855-a173-43b4-8660-17289a5146b5%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_4.56.57.png%3Ftable%3Dblock%26id%3Dab040ba0-c6ab-4d26-a4f1-1750c192f34a%26cache%3Dv2&w=3840&q=75)
트리 (Tree)
트리(Tree)란?
트리(Tree)는 그래프의 일종으로, 계층적인 구조를 표현하는 자료구조입니다. 순환 구조가 아니며, 1개의 루트 노드가 존재합니다. 루트 노드를 제외한 노드는 단 1개의 부모 노드를 갖습니다.
트리 용어 정리
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252F92dbcf5c-7f05-47aa-9c70-0de5f38e5f7e%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_5.38.54.png%3Ftable%3Dblock%26id%3D003a6e68-f75f-40ed-b204-41e07bc91b95%26cache%3Dv2&w=3840&q=75)
- 루트 노드: 트리에서 가장 상위에 있는 노드를 의미합니다.
- 부모 노드: 두 노드 관계에서 상위 노드에 해당하는 노드입니다.
- 자식 노드: 두 노드 관계에서 히위 노드에 해당하는 노드입니다.
- 리프 노드: 트리에서 가장 하위에 존재하는, 자식 노드가 없는 노드를 의미합니다.
- 서브 트리: 전체 트리에 속한 작은 트리를 의미합니다.
이진트리
가장 기본적인 트리인 이진 트리에 대해 알아보겠습니다. 이진 트리는 부모 노드의 자식 노드의 개수가 최대 2개인 트리를 의미합니다.
편향 이진 트리
노드들이 한 쪽으로 편향된 이진트리입니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252F800cf5d7-6ddd-4f74-b3b0-bb0243cd328a%252FUntitled.png%3Ftable%3Dblock%26id%3D4347cd61-96de-41be-a039-3c15f3b3e6b1%26cache%3Dv2&w=3840&q=75)
포화 이진 트리
트리의 높이가 모두 일정하고, 리프 노드가 꽉 찬 이진트리입니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252F757b1101-bdbd-4222-9e8a-ffe66acff436%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_5.54.38.png%3Ftable%3Dblock%26id%3D52fe9c61-025f-427e-8deb-f7039702d740%26cache%3Dv2&w=3840&q=75)
완전이진 트리
마지막 레벨을 제외하고 노드들이 채워져 있고, 마지막 레벨은 왼쪽부터 채워진 이진트리입니다. 일반적으로 코딩 테스트를 할때는 완전 이진 트리 형태를 사용합니다
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252Fd384acc0-effb-41d9-afb9-1565deeafa1d%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_5.55.03.png%3Ftable%3Dblock%26id%3D974395fa-899d-4bc7-8d18-46b42bf0158f%26cache%3Dv2&w=3840&q=75)
트리 표현
배열
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252Fcee6511a-6d69-471f-8b4e-27ff2c1a7137%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-05-15_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_6.03.29.png%3Ftable%3Dblock%26id%3D53fbd16a-1557-417f-895e-264d61e780b9%26cache%3Dv2&w=3840&q=75)
배열의 각 요소는 트리의 노드를 나타내며, 노드의 값(알파벳)이 해당 요소에 저장됩니다. 트리의 층(level)에 따라 배열의 인덱스가 할당됩니다. 루트 노드는 0번 인덱스부터 시작하여, 각 층마다 인덱스가 증가합니다. 또한 배열의 크기는 트리의 최대 크기에 맞게 미리 할당되어야 합니다. 이 예시에서는 5개의 노드가 있으므로, 배열의 크기는 5입니다.
인접 리스트
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F83c75a39-3aba-4ba4-a792-7aefe4b07895%252F4fe0f519-774f-42d2-893e-ad0a760a2b67%252FUntitled.png%3Ftable%3Dblock%26id%3D4f93ab15-3495-4797-90a0-d41a55794ac1%26cache%3Dv2&w=3840&q=75)
인접 리스트를 이용한 트리 표현은 불균형한 트리나 희소 트리(자식 노드가 적은 트리)에 적합합니다. 루트 노드(A)는 별도로 저장되거나 인접 리스트의 첫 번째 요소로 표현되고, 각 노드의 인접 리스트에는 해당 노드의 자식 노드들이 저장됩니다
내일배움캠프는 개발에 필요한 핵심만 배웁니다
지금까지 꼭 필요한 개발 지식에 대해 알아보았습니다. 내일배움캠프에서는 전문가들이 선별한 핵심 개발 지식으로 개발 공부도, 취업도 보다 효율적으로 할 수 있는데요. 국내 유수의 IT기업 출신 튜터님들과 실습 위주의 독보적인 커리큘럼으로 개발자 취업을 체계적으로 준비해보세요. 내일배움캠프 4개월, 여러분 인생의 가장 큰 터닝 포인트입니다.
CREDIT
글 | 조원호 내일배움캠프 수료생
편집 | 정효재 팀스파르타 에디터
취업 준비, 어디서부터 시작해야 할지 모르겠다면?
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
Share article
Subscribe to our newsletter