Notice
Recent Posts
Recent Comments
Link
할껀하고놀자
[백준] 16234번 인구이동 본문
728x90
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int [] dy = {0,0,1,-1};
static int [] dx = {1,-1,0,0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int l = sc.nextInt();
int r = sc.nextInt();
int [][] a = new int [n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = sc.nextInt();
}
}
int ans = 0;
while(true) {
if(bfs(a,l,r)) {
ans++;
}else {
break;
}
}
System.out.println(ans);
}
static boolean bfs(int [][] a,int l,int r) {
int n = a.length;
boolean [][] c = new boolean [n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
c[i][j] = false;
}
}
boolean ok = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(c[i][j]==false) {
Queue<Integer> q = new LinkedList<>();
q.add(i);q.add(j);
c[i][j] = true;
int sum = a[i][j];
Queue<Integer> s = new LinkedList<>();
s.add(i);s.add(j);
while(!q.isEmpty()) {
int y = q.remove();
int x = q.remove();
for (int k = 0; k < 4; k++) {
int ny = y+dy[k];
int nx = x+dx[k];
if(0<=ny && ny<n && 0<=nx&& nx<n) {
if(c[ny][nx])continue;
int diff = a[ny][nx] - a[y][x];
if(diff<0) {
diff = -diff;
}
if(l<=diff && diff<=r) {
q.add(ny);q.add(nx);
s.add(ny);s.add(nx);
c[ny][nx] = true;
ok=true;
sum+=a[ny][nx];
}
}
}
}
int val = sum / (s.size()/2);
while(!s.isEmpty()) {
int y = s.remove();
int x = s.remove();
a[y][x] = val;
}
}
}
}
return ok;
}
}
포인트 : 인구 이동이 이루어졌다면 하나씩 증가하고, 더이상 이루어 지지 않는다면 출력하기.
'[IT] > 백준' 카테고리의 다른 글
[백준] 11047번 동전 0 (0) | 2019.05.31 |
---|---|
[백준] 5585번 거스름돈 (0) | 2019.05.31 |
[백준] 16236번 아기상어 (0) | 2019.05.30 |
[백준] 1181번 단어 정렬 (0) | 2019.05.28 |
[백준] 1427번 소트인사이드 (0) | 2019.05.28 |
Comments