티스토리 뷰

알고리즘/백준

[백준] 1261번 알고스팟

머어하지 2018. 8. 15. 15:09


1) 생각

문제를 보니 백준님과 알고스팟 운영진분이 친하신가? 라는 생각을 한 번 하게되는 문제였다. 일반적인 Queue를 사용하여 BFS 방식으로 푸니 시간 초과가 발생하였다.


2) 방안

가중치가 최소화 되는 값만 찾으면되므로 다익스트라 방식으로 PriorityQueue로 바꾸어서 가중치가 최소인 값을 우선 탐색하도록 하였다. (PriorityQueue를 사용시 변수가 여러개이면 Compartor나 Comparable을 이용하여 Sorting을 위한 분류 종류를 만들어주어야한다.)


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
62
63
import java.util.PriorityQueue;
import java.util.Scanner;
 
public class Main{
    static int n,m;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        int[][] arr = new int[m][n];
        for(int i=0;i<m;i++) {
            String t = sc.next();
            for(int j=0;j<n;j++)
                arr[i][j] = t.charAt(j)-'0';
        }
        visited = new boolean[m][n];
        System.out.println(solve(arr));
    }
    
    static int[][] dir = {{0,1},{1,0},{-1,0},{0,-1}};
    static boolean[][] visited;
    private static int solve(int[][] arr) {
        PriorityQueue<Pair> queue = new PriorityQueue<>();
        queue.add(new Pair(0,0,0));
        visited[0][0= true;
        int min = Integer.MAX_VALUE;
        while(!queue.isEmpty()) {
            Pair t = queue.poll();
            
            if(t.x==m-1 && t.y==n-1) {
                min = Math.min(min, t.cnt);
                break;
            }
            
            for(int i=0;i<4;i++) {
                int tx = t.x+dir[i][0];
                int ty = t.y+dir[i][1];
                if(tx<0 || ty<0 || ty>=|| tx>=m) continue;
                if(visited[tx][ty]) continue;
                visited[tx][ty] = true;
                if(arr[tx][ty]==1)
                    queue.add(new Pair(tx,ty,t.cnt+1));
                else queue.add(new Pair(tx,ty,t.cnt));
            }
        }
        return min;
    }
    
    static class Pair implements Comparable<Pair>{
        private int x;
        private int y;
        private int cnt;
        public Pair(int x,int y,int cnt) {
            this.x = x;
            this.y = y;
            this.cnt = cnt;
        }
        @Override
        public int compareTo(Pair o) {
            return cnt>o.cnt?1:cnt==o.cnt?0:-1;
        }
    }
}


'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1261번 탈출  (0) 2018.08.15
[백준] 12851번 숨바꼭질 2  (0) 2018.08.15
[백준] 13549번 숨바꼭질 3  (0) 2018.08.15
[문제] 백준 2439번(별찍기 - 2)  (0) 2018.03.08
[문제] 백준 2839번(설탕 배달)  (0) 2018.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday