본문 바로가기

ProgramSoliving

백준 : 2842 JAVA

반응형

https://www.acmicpc.net/problem/2842

 

2842번: 집배원 한상덕

문제 상덕이는 언덕 위에 있는 마을의 우체국에 직업을 얻었다. 마을은 N×N 행렬로 나타낼 수 있다. 행렬로 나뉘어진 각 지역은 우체국은 'P', 집은 'K', 목초지는 '.' 중 하나로 나타낼 수 있다. 또, 각 지역의 고도도 알고 있다. 매일 아침 상덕이는 마을의 모든 집에 우편을 배달해야 한다. 배달은 마을에 하나밖에 없는 우체국 'P'가 있는 곳에서 시작한다. 상덕이는 현재 있는 칸과 수평, 수직, 대각선으로 인접한 칸으로 이동할 수 있다. 마지막

www.acmicpc.net

 

집배원 한상덕 문제...

문제를 푸는데 사용한 알고리즘은 우체국에서 K를 갈수있는 가를 검증하기 위한 BFS

그리고 java의 TreeSet을 이용한 높이에대한 중복제거

그리고 최소 비용을 구하기위한 이분법으로 접근을 하였다.

 

구할려는것은 최소의 비용이기때문에 지도의 가중치를 모두 TreeSet에 넣고 정렬하고 

index left , right를 만들어 left,right안에 모든 K를 방문할수 있으면 그값을 계산한다.

 

여기서 방문하지못하면 right를 증가시키고 방문하면 left를 증가시키는 방식으로 최소의 비용을 구할수가 있다.

 

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
 
 
public class B2842 {
    static int N;
    static int weight[][];
    static char Map[][];
 
    public static class XY {
        int y;
        int x;
 
        public XY(int y, int x) {
            super();
            this.y = y;
            this.x = x;
        }
 
    }
 
    static int dy[] = { 00111-1-1-1 };
    static int dx[] = { -1101-101-1 };
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st;
 
        weight = new int[N][N];
        Map = new char[N][N];
        XY start = null;
        int pCnt = 0;
        
        for (int i = 0; i < N; i++) {
            Map[i] = br.readLine().toCharArray();
            for (int j = 0; j < N; j++) {
                if (Map[i][j] == 'K') {
                    pCnt++;
                    
                }else if (Map[i][j] == 'P') {
                    start = new XY(i, j);
                }
                
            }
        }
        
        TreeSet<Integer> set = new TreeSet<Integer>();
 
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                weight[i][j] = Integer.parseInt(st.nextToken());
                set.add(weight[i][j]);
            }
        }
 
        Iterator<Integer> iter = set.iterator();
        int Look[] = new int[set.size()];
        for (int i = 0; i < set.size(); i++) {
            Look[i] = iter.next();
        }
        
        int result = Integer.MAX_VALUE;
        
        int left = 0;
        int right = 0;
        
        while(left<=right && right<set.size()) {
            int checkCnt = 0;
 
            Queue<XY> q =new LinkedList<>();
            boolean check[][] = new boolean[N][N];
            
            if(weight[start.y][start.x]>=Look[left] &&weight[start.y][start.x]<=Look[right]) {
                q.add(start);
                check[start.y][start.x] = true;
                
            }
            
            while(!q.isEmpty()) {
                XY tmp = q.poll();
                
                for(int d=0;d<8;d++) {
                    int ny = tmp.y + dy[d];
                    int nx = tmp.x + dx[d];
                    if(ny<0||nx<0||ny>=N||nx>=N)continue;
                    if(check[ny][nx])continue;
                    if(weight[ny][nx]<Look[left]||weight[ny][nx]>Look[right])continue;
                    
                    if(Map[ny][nx] == 'K') checkCnt++;
                    check[ny][nx] = true;
                    q.add(new XY(ny,nx));
                }
            }
            if(checkCnt == pCnt) {
                
                result = Math.min(result, Look[right]-Look[left]);
                left++;
            }else {
                right++;
            }
            
            
            
            
            
        }
        
        
 
        System.out.println(result);
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 4179  (0) 2020.02.20
백준 : 3109  (0) 2020.02.20
백준 : 11279  (0) 2020.02.09
백준 : 16637  (0) 2020.02.09
백준 : 17471  (0) 2020.02.09