일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 잔
- 컴퓨터공학 #자료구조 #스택 #c++ #알고리즘 #백준문제풀이
- 컴퓨터공학 #Java #자바 #클래스 #객체 #인스턴스
- HTML #CSS
- 컴퓨터공학 #c #c언어 #문자열입력
- BOJ #컴퓨터공학 #C++ #알고리즘 #자료구조
- Today
- Total
영벨롭 개발 일지
[알고리즘]랜덤 미로 생성 알고리즘: 엘러(Eller)의 알고리즘 본문
DFS나 BFS와 같은 여러 탐색 알고리즘들로 미로를 탐색할 수 있었죠?
오늘은 미로를 직접 만들어보겠습니다.
미로를 만드는 알고리즘에는 여러가지가 있는데 그 중 Eller's Algorithm 엘러의 알고리즘을 살펴보겠습니다.
- 랜덤 미로 생성 알고리즘 Eller's Algorithm
엘러의 알고리즘은 미로를 한 행 씩 차례로 생성해나가는 방법입니다.
가장 빠르게 미로를 생성하는 알고리즘 중 하나이다.
미로의 크기가 N이라면 시간복잡도는 O(N)으로, 미로를 선형시간 안에 만드는 엄청난 성능의 알고리즘입니다.
- 생성 과정
3x5 크기의 미로를 생성하는 과정은 다음과 같습니다.
1. 미로의 첫 번째 행을 초기화합니다.
이때 첫 번째 행에 속한 5개의 칸을 서로 다른 집합에 속하게 합니다.
2. 현재 행에서 첫 번째 칸부터 마지막 칸까지 탐색하여 수평 경로를 만들어줍니다.
인접해 있는 두 칸이 서로 다른 집합에 속해 있다면 두 칸 사이의 벽을 제거할지 남겨둘지 임의로 선택합니다.
이때 벽을 제거한다면 두 칸은 서로 같은 집합에 속하게 됩니다.
3. 현재 행과 다음 행 사이의 수직 경로를 만들어줍니다.
이때, 같은 집합에 속한 칸들 중 적어도 하나는 수직 경로를 만들어야 합니다.
벽이 하나 제거가 되었다면, 같은 집합 속 나머지 칸에 대에 대해서 수직 경로를 만들지 말지는 임의로 선택합니다.
4. 3.번에서 완성되지 않은 다음 행의 칸들의 집합을 정해줍니다.
5. 마지막 행에 도달할 때까지 2.~4. 과정을 반복합니다.
6. 마지막 행에 도달하면 인접해 있으면서 서로 다른 집합에 속한 칸들 사이의 모든 벽을 제거합니다.
'CS > 알고리즘' 카테고리의 다른 글
[알고리즘]분할정복을 이용한 정렬 알고리즘 - 병합 정렬 & 쾌속 정렬 (0) | 2022.05.06 |
---|---|
[알고리즘]이진 탐색 Binary Search 알고리즘 (0) | 2022.05.04 |
[알고리즘]브루트 포스 알고리즘, Brute Force Algorithm (0) | 2022.03.18 |
[알고리즘]그래프 탐색하기: BFS & DFS (0) | 2022.02.25 |
[알고리즘]다이나믹 프로그래밍(Dynamic Programming, DP) (0) | 2022.02.23 |