코딩/알고리즘
[ 백준 ][ 자바][ 16234 ] 인구이동
알파세
2019. 4. 5. 22:21
어라 티스토리 에디터가 변경됬다..
오 글씨체 이뻐이뻐
깔끔한게 이쁘다. 나중에 내 블로그 만들때 좀 참고해야겠다.
오랜만에 포스팅...
그말인 즉슨...나태했다는 의미다.
제일 중요한때 인데...뭐하는지...
여튼..이 문제는 조금 해맸다
예제만 보고 진행했다가 값이 안나와서 뭔가 싶었는데
연합은 딱 하나가 아닐수도 있다는것...고립되어있는 연합을 생각해줘야한다.
이거떄문에 해맸는데 나머지는 그냥 dfs다.
지금까지 본 삼성문제중엔 가장 쉬운거같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class Land{
int y;
int x;
Land(int y, int x){
this.y = y;
this.x = x;
}
}
public class Main_backjoon_16234_인구이동 {
static int N;
static int L;
static int R;
static int[][] MAP = new int[101][101];
static boolean[][] visited = new boolean[101][101];
static Queue q = new LinkedList();
static ArrayList openList = new ArrayList();
static int[] dx = {1, -1, 0, 0 };
static int[] dy = {0, 0, 1, -1};
static int CNT = 0;
static boolean isPossible;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine() , " ");
int idx = 0;
while(st.hasMoreTokens()) {
MAP[i][idx] = Integer.parseInt(st.nextToken());
idx ++;
}
}
while(true) {
isPossible = false;
for(int i= 0 ; i < N; i++) {
for(int j = 0; j < N; j++) {
if( visited[i][j] ) continue;
move(i,j);
}
}
//printMap();
if(!isPossible) {
System.out.println(CNT);
return;
}
CNT +=1;
visited = new boolean[101][101];
}
}
public static void printMap() {
System.out.println();
for(int i= 0 ; i < N; i++) {
for(int j = 0; j < N; j++) {
System.out.print(MAP[i][j] + " ");
}
System.out.println();
}
}
public static void move(int y, int x) {
boolean flag = false;
q.add(new Land(y,x));
//visited[y][x] = true;
//openList.add(new Land(y, x));
while(!q.isEmpty()) {
Land land = q.poll();
for(int i = 0 ; i < 4; i++) {
int yy = land.y + dy[i];
int xx = land.x + dx[i];
if( yy >= 0 && yy < N && xx >=0 && xx < N) {
//이미 방문한적 있으면
if( visited[yy][xx] ) continue;
int gap = Math.abs(MAP[land.y][land.x] - MAP[yy][xx]);
if( L <= gap && gap <= R ) {
q.add(new Land(yy,xx));
visited[yy][xx] = true;
openList.add(new Land(yy,xx));
isPossible = true;
flag = true;
}
}
}
}
//이동할 연합이 있으면
if( flag ) {
int size = openList.size();
if(size == 1) {
return;
}
int sum = 0;
for(int i =0 ; i < size; i++) {
Land land = openList.get(i);
sum += MAP[land.y][land.x];
}
for(int i =0 ; i < size; i++) {
Land land = openList.get(i);
MAP[land.y][land.x] = sum / size ;
}
openList.clear();
}
}
}