Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Flutter
- TiL
- corou
- 사이드프로젝트
- 4기
- 자바스크립트
- 핀토스
- 나만무
- 크래프톤 정글
- 리액트
- Java
- defee
- 크래프톤정글
- 티스토리챌린지
- CSS
- 시스템콜
- 백준
- 자바
- 모션비트
- 코드트리
- 스택
- JavaScript
- 알고리즘
- 큐
- HTML
- userprog
- pintos
- Vue.js
- 오블완
- 소켓
Archives
- Today
- Total
미새문지
크래프톤 정글 week02, day11 - 그래프 본문
728x90
그래프(Vertex, edge, node, arc)
- 구조
- 정점(Vertex)
- 그래프의 기본 단위로, 위치나 상태 등을 표현, 노드(Node)라고 부른다
- 간선(Edge)
- 두 개의 정점을 연결하는 선을 말하며 두 정점 사이의 관계나 거리 등을 표현
- 노드(Node)
- 간선과 같은 의미이며 특정 상태나 위치를 나타내는 점(dot)
- 그래프에서 점으로 표현
- 간선과 같은 의미이며 특정 상태나 위치를 나타내는 점(dot)
- 호(Arc)
- 방향성이 있는 간선을 의미. 두 정점을 연결하는 선이지만, 한 정점에서 다른 정점으로 방향이 정해져 있다.
- 정점(Vertex)
- 그래프는 정점과 정점들을 연결하는 간선으로 구성
- 그래프는 정점과 간선의 집합으로 이루어진 자료구조이다.
- 특징
- 방향성
- 방향성이 있는 그래프를 유향 그래프(Directed Graph)
- 방향성이 없는 그래프를 무향 그래프(Undirected Graph)
- 가중치
- 간선에 가중치가 할당되어 있을 수 있는데, 이를 가중 그래프(Weighted Graph)라고 한다.
- 루프와 다중 간선
- 그래프에는 자기 자신으로 돌아오는 루프나 두 정점 사이 여러 간선이 있을 수 있다.
- 연결성
- 모든 정점이 어떤 경로든 연결되어 있으면 연결 그래프(Connected Graph)라고 한다.
- 방향성
- 그래프 예시
- 최단 경로 문제
- 그래프에 주어진 두 정점 사이의 최단 경로를 찾는 문제
- ex) 구글 맵에서 한 지점에서 다른 지점까지의 최단 거리나 최소 시간을 계산
- 해결 알고리즘은 다익스트라(Dijkstra)나 플로이드-와샬(Floyd-Warchall)이 있다.
- 네트워크 플로우 문제
- 간선에 할당된 용량을 초과하지 않고, 목적지까지 얼마나 많은 양을 보낼 수 있는지 찾는 문제
- ex) 파이프라인 네트워크에서 최대 얼마의 물을 보낼 수 있는지 계산
- 해결 알고리즘은 포드-풀커슨(Ford-Fulkerson)이나 에드몬즈-카프(Edmonds-Karp)가 있다.
- 그래프 색칠 문제
- 그래프의 정점들을 색칠하는데 인접한 두 정점이 같은 색이 되지 않도록 색을 분배하는 문제
- ex) 지도 색칠 문제에서 최소의 색으로 모든 국가를 색칠
- 해결 알고리즘은 백트래킹(Backtracking)이 있다.
- 최단 경로 문제
다익스트라(Dijkstra)
- 그래프에서 주어진 시작점과 나머지 모든 정점들 간의 최단 경로를 찾는 알고리즘
- 음이 아닌 가중치를 가진 그래프에 사용 가능
- 가중치란, 정점 간에 연결된 간선에 부여된 값이다. 이 가중치는 두 정점을 연결하는 간선의 비용이나 거리 등을 나타낼 수 있다.
- 음의 가중치는 가중치 값이 음수인 경우이며, 음의 가중치가 있는 그래프는 사이클을 계속 돌며 비용을 무한이 줄일 수 있기 때문에 최단 경로를 찾는 일이 복잡해진다. 이를 해결하기 위해 벨만-포드 알고리즘이 사용됨
- 동작 방식
- 1. 아직 방문되지 않은 정점 중에 가장 거리가 짧은 정점을 찾는다.
- 2. 해당 정점을 방문됨으로 표시하고, 인접한 정점들의 거리를 현재 저장된 거리와 새로운 경로를 통한 거리 중 더 짧은 거리로 업데이트하는 것을 의미한다.
- 모든 정점이 방문됨이 표시될 때까지 과정 반복
- 예시
- 도시의 여러 위치를 연결하는 버스 노선이 주어졌을 때, 한 위치에서 다른 위치로 가는 최단 시간을 찾는데 사용한다.
플로이드 와샬(Floyd-Warshall)
- 그래프에서 모든 정점 간의 최단 거리를 구하는 알고리즘이며, 다 익스트라와 다르게 시작점의 노드 만이 아닌 모든 노드들의 최단 거리를 구한다.
- 음의 가중치를 가진 간선이 있어도 사용가능하지만, 음의 사이클이 있는 경우엔 사용 불가
- 중간에 다른 정점을 거쳐가는 경로를 고려해 최단 거리를 찾는데, 3중 반복문을 사용해 모든 정점 쌍에 대해 '중간 정점'을 거치는 모든 경로를 고려한다.
- 동작 과정
- 1. 모든 정점 간의 거리를 나타내는 2차원 배열 준비. 배열의 초기 값은 주어진 그래프의 가중치로 설정하고, 간선이 없는 경우는 무한대로 설정, 자기 자신 거리는 0으로 설정
- 2. 3중 반복문을 통해 모든 정점을 한 번씩 거쳐가는 경로를 고려한다. 이때 기존 거리보다 새로운 경로를 통한 거리가 더 짧다면 거리를 갱신
BFS(Breadth-First Search) 너비 우선 탐색
- 시작 정점에서 가장 가까운 정점을 먼저 방문하고, 인접한 정점들을 차례로 방문하는 방식이며 큐를 사용해 구현할 수 있다.
- 과정
- 1. 탐색을 시작할 정점을 큐에 삽입
- 2. 큐에서 정점을 하나 꺼내고, 그 정점이 탐색의 목표면 탐색 종료
- 3. 그렇지 않으면, 해당 정점에 인접한 정점 중 아직 방문하지 않은 정점을 모두 큐에 삽입하고 방문했다는 사실을 체크
- 4. 큐가 빌 때까지 2번, 3번 과정 반복
- 예시
- 미로의 입구에서 출구까지 가장 빠른 경로를 찾는 미로찾기 문제
- 이 문제에서 BFS를 사용할 때, 가장 먼저 찾은 경로가 최단 경로인걸 알 수 있다.
- 미로의 입구에서 출구까지 가장 빠른 경로를 찾는 미로찾기 문제
DFS(Depth-First Search) 깊이 우선 탐색
- 한 방향으로 갈 수 있는 한 계속 가다가 갈 곳이 없으면 이전으로 돌아와 다음 경로를 탐색하는 방식
- 스택으로 구현하거나 재귀함수를 사용해 구현할 수 있다.
- 과정
- 1. 탐색을 시작할 정점을 스택에 넣는다.
- 2. 스택의 최상단 정점을 확인. 이 정점이 탐색의 목표라면 탐색종료
- 3. 그렇지 않다면, 해당 정점에 인접한 정점 중 방문하지 않은 정점을 모두 스택에 추가하고 각 정점에 방문했다는 사실을 체크
- 4. 스택이 빌 때까지 2번, 3번 과정 반복
- 예시
- 그래프의 모든 정점을 방문하는 문제에서 DFS를 사용할 시, 한 정점에서 시작해 깊이 우선으로 모든 정점을 방문 가능하다.
- 그래프의 구조를 파악하거나 두 정점이 연결되어 있는지 확인하는 등의 문제에서 사용
학습시간 : 10 ~ 25시
728x90
'크래프톤 정글 > TIL' 카테고리의 다른 글
크래프톤 정글 week02, day13 - 트리, 알고리즘 문제 (1) | 2024.02.19 |
---|---|
크래프톤 정글 week02, day12 - 위상정렬, B-Tree, 트라이, 최소 신장 트리 (1) | 2024.02.19 |
크래프톤 정글 week01, day10 - 알고리즘 문제 (1) | 2024.02.19 |
크래프톤 정글 week01, day09 - 알고리즘 문제 (1) | 2024.02.19 |
크래프톤 정글 week01, day08 - 하노이탑, 1주차 공부키워드 - 2, 퀵 정렬 (1) | 2024.02.19 |