You will be fine

<Algorithm> 201. 게임맵최단거리(Programmers)

by BFine
반응형

1. 게임맵최단거리(Programmers)

   사용 알고리즘 :  BFS

 

기본적인 경로의 최소값 문제 solve를 호출해야 하는데 solution을 호출해 StackOverFlow가 발생했었다.... 

당연히 잘못썼다는 생각을 못하고 로직의 문제점만 찾다가 출력이 아예 안되는 것을 발견한 후에야 알았다... 

 

문제에 대한 접근&생각

  1. 왼쪽 끝에서 오른쪽 끝까지 가는 경로 최솟값 -> 결과조건!
  2. 이 경로는 여러가지가 있을 수 있음 -> 경로수가 아닌 최단경로 비용 필요 -> DFS! or BFS!  

 

코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.LinkedList;
import java.util.Queue;
 
public class Solution {
    static int[] dx = {0,0,1,-1};
    static int[] dy = {1,-1,0,0};
    static int n;
    static int m;
    public int solution(int[][] maps) {
        int answer = 0;
        n = maps.length;
        m = maps[0].length;
        /******************************
         * BFS 탐색을 통해서 끝점까지가는
         * 경로의 최솟값을 구한다.
         *******************************/
        visited = new boolean[n][m];
        dist = new int[n][m];
        answer = solve(maps);
        return answer;
    }
    static boolean[][] visited;
    static int[][] dist;
    public int solve(int[][] maps) {
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(00));
        visited[0][0= true;
        dist[0][0= 1;
        while (!queue.isEmpty()) {
            Pair p = queue.remove();
            for(int i = 0; i < 4; i++) {
                int nx = p.x + dx[i];
                int ny = p.y + dy[i];
                if(isBoundary(nx, ny) && maps[nx][ny]==1) {
                    visited[nx][ny] = true;
                    dist[nx][ny] = dist[p.x][p.y]+1;
                    queue.add(new Pair(nx, ny));
                    if(nx == n-1 && ny == m-1) {
                        return dist[nx][ny];
                    }
                }
            }
        }
        return -1;
    }
    public boolean isBoundary(int nx, int ny) {
        if(nx < 0||ny < 0||nx >= n||ny>=m||visited[nx][ny]) {
            return false;
        }else
            return    true;
    }
    static class Pair{
        int x,y;
        public Pair(int x, int y) {
            super();
            this.x = x;
            this.y = y;
        }
    }
    
}
 
cs
 

 

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기