티스토리 뷰
반응형
미로찾기(Decision Problem)
Decision Problem 답이 yes or no 인 문제
미로 찾기에 대해서 알아보겠습니다.
현재 위치에서 출구까지 가는 경우는 2가지로 나눠집니다. 1) 현재 위치가 출구 2) 이웃한 셀들 중 하나에서 현재 위치를 지나지 않고 출구까지 경로
이것을 수도 코드로 표현하면 다음과 같습니다.
수도코드
boolean findPath(x,y)
if (x,y) is either on the wall or a visited cell //1)
return false;
else if (x,y) is the exit // 2)
return true;
else
mark (x,y) as a visited cell; // 3)
for each neighbouring cell(x',y') of (x,y) do
if findPath(x',y')
return true;
return false
수도 코드 풀이하면 다음과 같습니다. 1) 현재 좌표가 벽 또는 방문한 적이 있는지 체크 합니다. 2) 출구인지 체크합니다. 3) 방문 길을 기록 합니다. 4) 각각 근처의 셀을 방문합니다.
MazePath.java
/**
* 미로 길 찾기
**/
public static boolean findMazePath(int x, int y){
if (x < 0 || y < 0 || x >= N || y >= N){
return false;
}else if (maze[x][y] != PATHWAY_COLOUR) {
return false;
}else if (x == N -1 && y == N - 1){
return true;
}else{
maze[x][y] = PATH_COLOUR;
if ( findMazePath( x-1, y) || findMazePath(x , y + 1) ||
findMazePath(x + 1, y ) || findMazePath(x, y - 1)){
return true;
}
maze[x][y] = BLOCKED_COLOUR;
return false;
}
}
/**
* 미로 보여주기
**/
public static void printMazePath(){
System.out.println("##############");
for(int[] data : maze){
System.out.printf("## ");
for(int item : data){
System.out.printf(String.format("%d", item));
}
System.out.println(" ##");
}
System.out.println("##############\n");
}
Main.java
public static void main(String[] args) {
System.out.println(maze);
findMazePath(0, 0);
System.out.println(maze);
}
소스 설명
MazePath.java 은 Recursion을 활용한 예시로 미로 찾기를 구성하였습니다.
1) x, y 값을 받을 때 해당 값이 미로를 벗어나고 있지 않는지 체크합니다.
if (x < 0 || y < 0 || x >= N || y >= N){
2) 같은 공간을 지나가지 않기 하기 위해서는 지난 가기 전의 값인지 체크합니다.
if (maze[x][y] != PATHWAY_COLOUR)
3) 최종 출구는 N -1 의 좌표값을 갖고 있는지 체크하여 보여줍니다.
if (x == N -1 && y == N - 1)
4) 지나갈 길은 PATH_COLOR로 설정하고 북, 동, 남, 서 를 기준으로 Recursion 으로 지나갈 수 있는 길이 있는지 체크합니다.
마무리
미로찾기에 대해서 막막했던 알고리즘이 간단히 해결되는 것을 경험하였습니다.
(인프런)를 기반으로 작성되었습니다.
반응형
'프로그래밍 > Algrism' 카테고리의 다른 글
[Algorism] 합병정렬(Merge Sort) (0) | 2019.04.18 |
---|---|
[알고리즘] 간단한 정렬 알고리즘(Bubble, Insertion, Selection) (0) | 2019.03.29 |
멱집합 (0) | 2019.01.24 |
댓글
최근에 올라온 글
최근에 달린 댓글
TAG
- java
- swift
- 알고리즘
- 임용고시
- missionchina
- view
- flutter
- 패턴
- 안드로이드
- 탁구
- MCC
- 선교
- 점수판
- 디자인패턴
- 미션차이나센터
- push
- missioon
- issue
- 코틀린
- 고시문헬퍼
- DI
- 고시문
- 스코어헬퍼
- RXjava
- IT
- Kotlin
- IOS
- Android Studio
- Android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함