๋ฌธ์
๋ฌธ์ ๋งํฌ https://www.acmicpc.net/problem/2667
- <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ ์ฌ๊ฐํ ๋ชจ์์ ์ง๋๊ฐ ์๋ค. 1์ ์ง์ด ์๋ ๊ณณ์, 0์ ์ง์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค.
- ์ฒ ์๋ ์ด ์ง๋๋ฅผ ๊ฐ์ง๊ณ ์ฐ๊ฒฐ๋ ์ง์ ๋ชจ์์ธ ๋จ์ง๋ฅผ ์ ์ํ๊ณ , ๋จ์ง์ ๋ฒํธ๋ฅผ ๋ถ์ด๋ ค ํ๋ค.
- ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๋์๋ค๋ ๊ฒ์ ์ด๋ค ์ง์ด ์ข์ฐ, ํน์ ์๋์๋ก ๋ค๋ฅธ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ๋๊ฐ์ ์์ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์๋๋ค.
- <๊ทธ๋ฆผ 2>๋ <๊ทธ๋ฆผ 1>์ ๋จ์ง๋ณ๋ก ๋ฒํธ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค. ์ง๋๋ฅผ ์ ๋ ฅํ์ฌ ๋จ์ง์๋ฅผ ์ถ๋ ฅํ๊ณ , ๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
- ์ฒซ ๋ฒ์งธ ์ค์๋ ์ง๋์ ํฌ๊ธฐ N(์ ์ฌ๊ฐํ์ด๋ฏ๋ก ๊ฐ๋ก์ ์ธ๋ก์ ํฌ๊ธฐ๋ ๊ฐ์ผ๋ฉฐ 5≤N≤25)์ด ์ ๋ ฅ๋๊ณ , ๊ทธ ๋ค์ N์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์๋ฃ(0ํน์ 1)๊ฐ ์ ๋ ฅ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ค์๋ ์ด ๋จ์ง์๋ฅผ ์ถ๋ ฅํ์์ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋จ์ง๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ์์ค.
์์ด๋์ด
- ๋ฐฉ๋ฌธํ์ง ์์๊ณ ๊ฐ์ด 1์ธ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก BFS๋ฅผ ๋๋ฆฐ๋ค.
- BFS๋ฅผ ๋๋ฆฌ๋ฉด์ ์ํ์ข์ฐ๋ฅผ ํ์ํ์ฌ ์ฐ๊ฒฐ๋์ด ์๋ ์ขํ๊ฐ์ด 1์ธ ์ขํ๊ฐ์ ์ฐพ๊ณ ์นด์ดํธ๋ฅผ ํด์ค ํ, ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
- ๊ทธ๋ ๊ฒ BFS๋ฅผ ๋๋ฆฌ๊ณ Queue๊ฐ ๋น๋ฉด ์นด์ดํธํ ๋ณ์๋ฅผ return ํด์ค์ ArrayList์ ๋ด๋๋ค (ํ ๋จ์ง์ ์๋ ์ฌ๋์ ์)
- ๊ทธ๋ ๊ฒ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ๋๊น์ง ๋๋ฆฌ๋ฉด ๋จ์ง๋ง๋ค ๋ช๋ช ์๋์ง ArrayList์ ์ ์ฅ์ด ๋๋๋ฐ, ๊ทธ ArrayList๋ฅผ ์ ๋ ฌ ํ ์ถ๋ ฅํ๋ค.
๊ฒช์ ์ํ์ฐฉ์ค
- X
์ฝ๋
import java.io.*;
import java.util.*;
import java.awt.*;
public class BOJ2667 {
static int N;
static int map[][];
static boolean visited[][];
static ArrayList<Integer> result;
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// ํ, ์ด
N = Integer.parseInt(br.readLine());
// ์ง๋
map = new int[N][N];
// ๋ฐฉ๋ฌธ ์ฌ๋ถ
visited = new boolean[N][N];
// ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ ArrayList
result = new ArrayList<>();
// ์ง๋ ์
๋ ฅ
for(int i = 0; i < N; i++){
String s = br.readLine();
for(int j = 0; j < N; j++){
int n = Integer.parseInt(s.split("")[j]);
map[i][j] = n;
}
}
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
// ๋ง์ฝ ํด๋น ์ขํ๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์๋๋ฐ
// ๊ฐ์ด 1์ด๋ผ๋ฉด
if(!visited[i][j] && (map[i][j] == 1)){
int cnt = BFS(i, j);
// returnํ ์ฌ๋์๋ฅผ ArrayList์ ๋ฃ์ด์ค
result.add(cnt);
}
}
}
// ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
Collections.sort(result);
sb.append(result.size() + "\n");
for(int i : result){
sb.append(i + "\n");
}
System.out.println(sb);
}
public static int BFS(int x, int y){
Queue<Point> q = new LinkedList<>();
// ๋ค์ด์จ ์ขํ๊ฐ์ Queue์ ๋ฃ์ด์ค
q.offer(new Point(x, y));
// ํด๋น ์ขํ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[x][y] = true;
// ์ฌ๋ ์
int people = 1;
// Queue๊ฐ ๋น๋๊น์ง
while(!q.isEmpty()){
// Queue์ ์ ์ฅ๋ ์ขํ๊ฐ
int xx = q.peek().x;
int yy = q.peek().y;
q.poll();
// ๊บผ๋ธ ์ขํ ๊ธฐ์ค์ผ๋ก ์ํ์ข์ฐ ํ์
for(int i = 0; i < 4; i++){
// ์ํ์ข์ฐ๋ก ์ด๋ํ ์ขํ๊ฐ
int nx = xx + dx[i];
int ny = yy + dy[i];
// ๋ฐฐ์ด ๋ฒ์๊ฐ์ ๋ฒ์ด๋๋ฉด continue
if(nx >= N || nx < 0 || ny >= N || ny < 0){
continue;
}
// ๋ง์ฝ ์ด๋ํ ์ขํ๊ฐ์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ณ
// ๊ฐ์ด 1์ด๋ผ๋ฉด
if(!visited[nx][ny] && (map[nx][ny] == 1)){
// ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ
visited[nx][ny] = true;
// ์ฌ๋ ์ + 1์ ํ๊ณ
people = people + 1;
// Queue์ ํด๋น ์ขํ๊ฐ์ ๋ฃ์ด์ค
q.offer(new Point(nx, ny));
}
}
}
// ์นด์ดํธํ ์ฌ๋ ์ return
return people;
}
}
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] BOJ 6064 ์นด์ ๋ฌ๋ ฅ (0) | 2024.08.25 |
---|---|
[Java] BOJ 5525 IOIOI (0) | 2024.08.24 |
[Java] BOJ 2178 ๋ฏธ๋กํ์ (2) | 2024.08.22 |
[Java] BOJ 1931 ํ์์ค ๋ฐฐ์ (0) | 2024.08.21 |
[Java] BOJ 1697 ์จ๋ฐ๊ผญ์ง (0) | 2024.08.20 |