반응형
https://www.acmicpc.net/problem/2842
집배원 한상덕 문제...
문제를 푸는데 사용한 알고리즘은 우체국에서 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
|
package com.ssay.algo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
import java.util.TreeSet;
import com.ssay.algo.B2842.XY;
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[] = { 0, 0, 1, 1, 1, -1, -1, -1 };
static int dx[] = { -1, 1, 0, 1, -1, 0, 1, -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();
Look[i] = iter.next();
}
int result = Integer.MAX_VALUE;
int left = 0;
int right = 0;
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) {
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 |