https://www.acmicpc.net/problem/16234
๋ฌธ์
N×Nํฌ๊ธฐ์ ๋ ์ด ์๊ณ , ๋ ์ 1×1๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ๋ ์๋ ๋๋ผ๊ฐ ํ๋์ฉ ์กด์ฌํ๋ฉฐ, rํ c์ด์ ์๋ ๋๋ผ์๋ A[r][c]๋ช ์ด ์ด๊ณ ์๋ค. ์ธ์ ํ ๋๋ผ ์ฌ์ด์๋ ๊ตญ๊ฒฝ์ ์ด ์กด์ฌํ๋ค. ๋ชจ๋ ๋๋ผ๋ 1×1 ํฌ๊ธฐ์ด๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ์ ์ฌ๊ฐํ ํํ์ด๋ค.
์ค๋๋ถํฐ ์ธ๊ตฌ ์ด๋์ด ์์๋๋ ๋ ์ด๋ค.
์ธ๊ตฌ ์ด๋์ ํ๋ฃจ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๊ณ , ๋ ์ด์ ์๋ ๋ฐฉ๋ฒ์ ์ํด ์ธ๊ตฌ ์ด๋์ด ์์ ๋๊น์ง ์ง์๋๋ค.
- ๊ตญ๊ฒฝ์ ์ ๊ณต์ ํ๋ ๋ ๋๋ผ์ ์ธ๊ตฌ ์ฐจ์ด๊ฐ L๋ช ์ด์, R๋ช ์ดํ๋ผ๋ฉด, ๋ ๋๋ผ๊ฐ ๊ณต์ ํ๋ ๊ตญ๊ฒฝ์ ์ ์ค๋ ํ๋ฃจ ๋์ ์ฐ๋ค.
- ์์ ์กฐ๊ฑด์ ์ํด ์ด์ด์ผํ๋ ๊ตญ๊ฒฝ์ ์ด ๋ชจ๋ ์ด๋ ธ๋ค๋ฉด, ์ธ๊ตฌ ์ด๋์ ์์ํ๋ค.
- ๊ตญ๊ฒฝ์ ์ด ์ด๋ ค์์ด ์ธ์ ํ ์นธ๋ง์ ์ด์ฉํด ์ด๋ํ ์ ์์ผ๋ฉด, ๊ทธ ๋๋ผ๋ฅผ ์ค๋ ํ๋ฃจ ๋์์ ์ฐํฉ์ด๋ผ๊ณ ํ๋ค.
- ์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ๊ฐ ์นธ์ ์ธ๊ตฌ์๋ (์ฐํฉ์ ์ธ๊ตฌ์) / (์ฐํฉ์ ์ด๋ฃจ๊ณ ์๋ ์นธ์ ๊ฐ์)๊ฐ ๋๋ค. ํธ์์ ์์์ ์ ๋ฒ๋ฆฐ๋ค.
- ์ฐํฉ์ ํด์ฒดํ๊ณ , ๋ชจ๋ ๊ตญ๊ฒฝ์ ์ ๋ซ๋๋ค.
๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, L, R์ด ์ฃผ์ด์ง๋ค. (1 \(\leq\)N \(\leq\)50, 1 \(\leq\) L \(\leq\) R \(\leq\) 100)
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฐ ๋๋ผ์ ์ธ๊ตฌ์๊ฐ ์ฃผ์ด์ง๋ค. rํ c์ด์ ์ฃผ์ด์ง๋ ์ ์๋ A[r][c]์ ๊ฐ์ด๋ค. (0 \(\leq\) A[r][c] \(\leq\) 100)
์ธ๊ตฌ ์ด๋์ด ๋ฐ์ํ๋ ์ผ์๊ฐ 2,000๋ฒ ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ธ๊ตฌ ์ด๋์ด ๋ฉฐ์น ๋์ ๋ฐ์ํ๋์ง ์ฒซ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
ํ์ด
BFS
๋ฅผ ์ด์ฉํด ํ์ด
solution()
: ๊ฐ ๋๋ผ๋ฅผ ๋๋ฉด์ ๊ตญ๊ฒฝ์ ์ด ์ด๋ ธ๋์ง ํ์ธ
โฌ๏ธisOpen(int i, int j)
- BFS๋ก ์ธ์ ํ ๋๋ผ๋ค๊ณผ ์ธ๊ตฌ ์๊ฐ L์ด์ R์ดํ์ด๋ฉด ๊ตญ๊ฒฝ์ ์ ์คํ
- union List์ ์ถ๊ฐ
- ์ธ๊ตฌ ์๋ฅผ population / union.size()๋ก ๋ณ๊ฒฝ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main_BOJ_16234_์ธ๊ตฌ์ด๋ {
static int N, L, R;
static int[][] countries;
static boolean[][] isVisited;
static int[] dx = {-1, 0, 0, 1};
static int[] dy = {0, -1, 1, 0};
static Queue<int[]> queue;
static List<int[]> union;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
L = Integer.parseInt(stringTokenizer.nextToken());
R = Integer.parseInt(stringTokenizer.nextToken());
countries = new int[N][N];
for (int i = 0; i < N; i++) {
stringTokenizer = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
countries[i][j] = Integer.parseInt(stringTokenizer.nextToken());
}
}
int result = solution();
System.out.println(result);
}
private static int solution() {
int cnt = 0;
boolean isMove;
while (true) {
isVisited = new boolean[N][N];
isMove = false;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(isVisited[i][j]) continue;
if(isOpen(i,j)) isMove = true;
}
}
if(isMove) cnt++;
else return cnt;
}
}
private static boolean isOpen(int i, int j) {
queue = new LinkedList<>();
union = new ArrayList<>();
queue.add(new int[]{i, j});
union.add(new int[]{i, j});
isVisited[i][j] = true;
int population = countries[i][j];
while (!queue.isEmpty()) {
int[] now = queue.poll();
for (int d = 0; d < 4; d++) {
int nx = now[0] + dx[d];
int ny = now[1] + dy[d];
if (nx < 0 || N <= nx || ny < 0 || N <= ny || isVisited[nx][ny]) continue;
int dif = Math.abs(countries[now[0]][now[1]] - countries[nx][ny]);
if(dif < L || R < dif) continue;
population += countries[nx][ny];
queue.add(new int[]{nx, ny});
union.add(new int[]{nx, ny});
isVisited[nx][ny] = true;
}
}
if(union.size() < 2) return false;
int tmp = population / union.size();
for (int[] u : union) {
countries[u[0]][u[1]] = tmp;
}
return true;
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ๋ฐฑ์ค / BOJ 17144 ] ๋ฏธ์ธ๋จผ์ง ์๋ ! ( JAVA ) (0) | 2022.01.30 |
---|---|
[ ๋ฐฑ์ค / BOJ 21610 ] ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ฆฌ๊ธฐ ( JAVA ) (0) | 2022.01.30 |
[ ๋ฐฑ์ค / BOJ 1487 ] ๋ฌผ๊ฑด ํ๊ธฐ ( ์๋ฐ / JAVA ) (0) | 2021.11.24 |
[ ๋ฐฑ์ค / BOJ 2583 ] ์์ญ ๊ตฌํ๊ธฐ ( JAVA / ์๋ฐ ) (0) | 2021.11.24 |
[ ๋ฐฑ์ค / BOJ 1068 ] ํธ๋ฆฌ ( ์๋ฐ / JAVA ) (0) | 2021.11.24 |