๋ฌธ์
https://www.acmicpc.net/problem/16234
๋ด ๋ฌธ์ ํ์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
static int n, l, r;
static int[][] map, visited;
static int cnt, sum; // ํ์ฌ ์ฐํฉ์ ๋๋ผ ๊ฐ์, ํ์ฌ ์ฐํฉ์ ์ด ์ธ๊ตฌ์
static int teams, day; // ํ๋ฃจ์ ํด๋นํ๋ ์ฐํฉ์ ๊ฐ์, ๋ ์ง ์นด์ดํธ
static int[] dx = {0, 0, -1, 1};
static int[] dy = {-1, 1, 0, 0};
static Deque<int[]> que = new ArrayDeque<>();
public static void bfs(int i, int j) { // ์ฐํฉ ์ฐพ๊ธฐ (์ฐํฉ์ ์ด๋ฃจ๋ ๋๋ผ๋ visited์ 1๋ก ํ์)
while(!que.isEmpty()) {
int[] now = que.removeFirst();
int x = now[0];
int y = now[1];
for(int a = 0; a < 4; a++) {
int nx = x + dx[a];
int ny = y + dy[a];
if(nx < 0 || ny < 0 || nx >= n || ny >= n || visited[nx][ny] != 0) continue; // ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ ์๋ ๊ณณ์ผ ๋ผ
if(Math.abs(map[x][y] - map[nx][ny]) < l || Math.abs(map[x][y] - map[nx][ny]) > r) continue; // ์ธ๊ตฌ ์ฐจ๊ฐ ๊ธฐ์ค์ ๋ฒ์ด๋ ๋
visited[nx][ny] = 1;
sum += map[nx][ny];
cnt++;
que.add(new int[]{nx, ny});
}
}
visited[i][j] = -1; // ์์์ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ง ๋จ๊ฒจ๋๊ธฐ
if(cnt > 1) { // ์ฐํฉ์ด ์ด๋ฃจ์ด์ก์ ๋
teams++; // ์ฐํฉ ํ๋ ๋ฐ๊ฒฌํ์์ ํ์
map[i][j] = sum /cnt; // ์์์ ๋ง ๋จผ์ ์ธ๊ตฌ ์ด๋ ์์ผ์ฃผ๊ธฐ
que.add(new int[]{i, j});
update(map[i][j]);
}
}
public static void update(int popul) { // ์ธ๊ตฌ ์ด๋์์ผ์ฃผ๋ฉด์, ์ธ๊ตฌ ์ด๋์ ๋ง์น ๋๋ผ์ visited๋ -1๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ
while(!que.isEmpty()) {
int[] now = que.removeFirst();
int x = now[0];
int y = now[1];
for(int a = 0; a < 4; a++) {
int nx = x + dx[a];
int ny = y + dy[a];
if(nx < 0 || ny < 0 || nx >= n || ny >= n || visited[nx][ny] != 1) continue; // ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ํ์ฌ ์ฐพ๋ ์ฐํฉ์ด ์๋ ๋
map[nx][ny] = popul; // ์ธ๊ตฌ์ด๋
visited[nx][ny] = -1; // ์ธ๊ตฌ์ด๋์ ๋ง์น ์ฐํฉ์์ ํ์
que.add(new int[]{nx, ny});
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(in.readLine());
n = Integer.parseInt(st.nextToken());
l = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
map = new int[n][n];
visited = new int[n][n];
day = 0;
for(int i = 0; i < n; i++) {
st = new StringTokenizer(in.readLine());
for(int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
while(true) { // ํ ๋ฒ์ while ๋ฐ๋ณต == ํ๋ฃจ
teams = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(visited[i][j] == 0) {
que.add(new int[]{i, j});
cnt = 1;
sum = map[i][j];
visited[i][j] = 1;
bfs(i, j);
}
}
}
if(teams == 0) { // ์ฐํฉ์ด ํ๋๋ ์์ ๋
System.out.println(day);
return;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
visited[i][j] = 0;
}
}
day++;
}
}
}
๐ BFS ๋ฌธ์
- visited๋ฅผ ์ฐจ๋ก๋๋ก ํ์ํ๋ฉด์ ์ฐํฉ์ ์ด๋ฃจ์ง ์์ ๋๋ผ๋ฅผ ์ฐพ์์ฃผ์๋ค.
visited๋ intํ 2์ฐจ์ ๋ฐฐ์ด์ธ๋ฐ, 0 ํน์ 1 ํน์ -1๋ง ์ ์ฅ๋ ์ ์๊ฒ ํ๋ค.
(0: ์ฐํฉ์ ์ด๋ฃจ์ง ์์ ๋๋ผ / -1: ์ด๋ฏธ ์ฒดํฌํด์ค ๋๋ผ / 1: ํ์ฌ ์ฐํฉ์ ์ด๋ฃจ๋ ๋๋ผ) - 2์ค for๋ฌธ์ ๋๋ฉด์ visited๊ฐ 0์ธ ๋๋ผ๋ฅผ ๋ง๋๋ฉด, ์์ง ์ฐํฉ์ ๊ตฌํ์ง ๋ชปํ ๋๋ผ์ด๋ฏ๋ก
bfs ํจ์๋ฅผ ํตํด ์ฐํฉ์ด ๋ ์ ์๋์ง ์ฃผ๋ณ์ ์ฒดํฌํด์ฃผ์๋ค. - bfs์์๋ ์ํ์ข์ฐ๋ฅผ ํ์ํ๋ฉฐ ์ฐํฉ์ด ๋ ์ ์๋์ง ํ์ธ ํ,
๋ ์ ์๋ ๋๋ผ ๋ฐ๊ฒฌ ์ ์ฐํฉ์ด ๋์์์ ํ์ํ๊ธฐ ์ํด visited๋ฅผ 1๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ์ ๋์์ sum์ ํด๋น ๋๋ผ์ ์ธ๊ตฌ ์๋ฅผ ๋ํ๊ณ ,
cnt ๋ณ์๋ฅผ 1 ๋๋ ค์ ์ฐํฉ ๋๋ผ์ ๊ฐ์๋ฅผ ์ธ์ด์ฃผ์๋ค. - ์์ ๊ฐ์ ํ์์ ๋ฐ๋ณตํ๋ค๊ฐ ๋ ์ด์ ์ฐํฉ์ด ๋ ์ ์๋ ๋๋ผ๊ฐ ์๋ค๋ฉด
update ํจ์๋ฅผ ๋ถ๋ฌ์ ์ธ๊ตฌ ์ด๋๊ณผ visited ํจ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ผ์ฃผ์๋ค. - update ํจ์๋ sum / cnt๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ณ ,
bfs ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก que๋ฅผ ์ด์ฉํด bfs ํ์์ ํ ์ ์๋๋ก ์์ฑํ๋ค.
(์ด์ฐจํผ ๋ฐฉ๊ธ ํ์ํ๋ ์ฐํฉ์ ๋ชจ๋ ์ธ์ ํด์์ผ๋ฏ๋ก bfs๋ฅผ ์ด์ฉํด ํจ์จ์ ์ผ๋ก ํ์ ๊ฐ๋ฅ) - update์์๋ ํ์์ ํ๋ฉด์ ์ฐํฉ์ ํด๋นํ๋ ๋๋ผ๋ค์ ์ธ๊ตฌ๋ฅผ ์
๋ฐ์ดํธ ์์ผฐ๊ณ ,
์ธ๊ตฌ ์ด๋์ ์๋ฃํ ๋๋ผ๋ visited๋ฅผ -1๋ก ๋ฐ๊ฟ์ฃผ์ด ์ด๋ฏธ ์ฒดํฌ๊ฐ ์๋ฃ๋ ๋๋ผ์์ ํ์ํ๋ค. - ์์ ๊ฐ์ ์คํ์ map์ ๋ชจ๋ ๋๋ผ๋ฅผ ์ฒดํฌํ ๋๊น์ง ๋ฐ๋ณตํ๊ณ ,
๋ฐ๋ณต์ด ๋๋๋ฉด teams ๋ณ์๋ฅผ ํ์ธํ์ฌ ์ฐํฉ์ด ํ๋๋ผ๋ ์์๋์ง๋ฅผ ์ฒดํฌํ๋ค.
teams ๋ณ์๋ bfs ํจ์์์ ํ๋์ ์ฐํฉ์ ๋ฐ๊ฒฌํ๋ฉด ++ํด์ฃผ์๋๋ฐ,
teams๋ณ์๊ฐ 0์ด๋ผ๋ฉด ํ ๊ฐ์ ์ฐํฉ๋ ์์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ณ return ํ๋ค. - teams ๋ณ์๊ฐ 0์ด ์๋๋ฉด ์ฐํฉ์ด ํ๋ ์ด์ ์์๋ค๋ ์๋ฏธ์ด๋ฉฐ,
์ด๋ ๋ค์ ๋ ์ ์ธ๊ตฌ ์ด๋๋ ์์ ์ ์๋ค๋ ๊ฐ๋ฅ์ฑ์ ๋ดํฌํ๋ฏ๋ก ๋ค์ ๋ฐ๋ณต์ ๋ ๋ค์ ์งํ์์ผฐ๋ค.
๐ก ํผ๋๋ฐฑ
- ๋ ๊ฐ์ง ์ข ๋ฅ์ bfs ํจ์๋ฅผ ์์ฑํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
'2๏ธโฃ Java > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java Algorithm] ํ์ดํ ์ฎ๊ธฐ๊ธฐ 2 BOJ #17069 (0) | 2022.09.30 |
---|---|
[Java Algorithm] ํ์ดํ ์ฎ๊ธฐ๊ธฐ 1 BOJ #17070 (2) | 2022.09.30 |
[Java Algorithm] ์ต์ ํ์์ค ๊ฐ์ BOJ #19598 (0) | 2022.08.31 |
[Java Algorithm] ๋์ 2 BOJ #2294 (0) | 2022.08.31 |
[Java Algorithm] ABCDE BOJ #13023 (0) | 2022.08.31 |
๋๊ธ