BOJ1926 ๊ทธ๋ฆผ
๋ฌธ์
์ด๋ค ํฐ ๋ํ์ง์ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์์ ๋, ๊ทธ ๊ทธ๋ฆผ์ ๊ฐ์์, ๊ทธ ๊ทธ๋ฆผ ์ค ๋์ด๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ๋์ด๋ฅผ ์ถ๋ ฅํ์ฌ๋ผ. ๋จ, ๊ทธ๋ฆผ์ด๋ผ๋ ๊ฒ์ 1๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ํ ๊ทธ๋ฆผ์ด๋ผ๊ณ ์ ์ํ์. ๊ฐ๋ก๋ ์ธ๋ก๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ์ฐ๊ฒฐ์ด ๋ ๊ฒ์ด๊ณ ๋๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ์ด ๋ ๊ฒ์ ๋จ์ด์ง ๊ทธ๋ฆผ์ด๋ค. ๊ทธ๋ฆผ์ ๋์ด๋ ๊ทธ๋ฆผ์ ํฌํจ๋ 1์ ๊ฐ์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ํ์ง์ ์ธ๋ก ํฌ๊ธฐ n(1 โค n โค 500)๊ณผ ๊ฐ๋ก ํฌ๊ธฐ m(1 โค m โค 500)์ด ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ n+1 ์ค ๊น์ง ๊ทธ๋ฆผ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. (๋จ ๊ทธ๋ฆผ์ ์ ๋ณด๋ 0๊ณผ 1์ด ๊ณต๋ฐฑ์ ๋๊ณ ์ฃผ์ด์ง๋ฉฐ, 0์ ์์น ์ด ์๋ ๋ถ๋ถ, 1์ ์์น ์ด ๋ ๋ถ๋ถ์ ์๋ฏธํ๋ค)
์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ๊ทธ๋ฆผ์ ๊ฐ์, ๋์งธ ์ค์๋ ๊ทธ ์ค ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์ถ๋ ฅํ์ฌ๋ผ. ๋จ, ๊ทธ๋ฆผ์ด ํ๋๋ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ 0์ด๋ค.
์์ ์ ๋ ฅ
6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1
๋ฌธ์ ํ์ด
์๊ตฌ ์ฌํญ ๋ถ์
- ๋ํ์ง์ ์ธ๋ก ํฌ๊ธฐ n๊ณผ ๊ฐ๋ก ํฌ๊ธฐ m์ด ์ฃผ์ด์ง๋ค. (1 โค n, m โค 500)
- ๋ํ์ง์ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์๋ค. ๊ทธ๋ฆผ์ 1๋ก ์ฑ์์ง ์์ญ์ด๊ณ , ๋น ๊ณณ์ 0์ผ๋ก ์ฑ์์ ธ ์๋ค. ๊ทธ๋ฆผ์ ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ํ๋์ ๊ทธ๋ฆผ์ด๋ผ๊ณ ์ ์ํ๋ค.
- ๋ํ์ง์ ์๋ ๊ทธ๋ฆผ์ ๊ฐ์์ ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
์๊ฐ ๋ณต์ก๋
- BFS ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉฐ, ๊ฐ ์ ์ ์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ฏ๋ก O(V)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. (์ฌ๊ธฐ์ V๋ ์ ์ ์ ๊ฐ์)
- ์ ์ : ๋ํ์ง์ ๊ฐ ์นธ
- ์ต๋ 500 x 500 = 25๋ง๊ฐ๊ฐ ๋ ์ ์๋ค.
- ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๋ O(250000) = O(10^5)๊ฐ ๋๋ค.
ํ์ด
package com.ll.level1.boj;
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
// ํ๊ณผ ์ด์ ์ ๋ณด๋ฅผ ๋ด์ ์ขํ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ Coord ํด๋์ค ์ ์
class Coord {
// ํ๊ณผ ์ด์ ์ ์ฅํ ํ๋ ์ ์ธ
int x;
int y;
// ์์ฑ์ ์ ์ (๋งค๊ฐ๋ณ์๋ก ํ๊ณผ ์ด์ ๋ฐ์ ํ๋์ ์ ์ฅ)
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
}
public class boj1926 {
// ์ํ์ข์ฐ ์ด๋์ ์ํ ๋ฐฐ์ด์ ์ ์
static int[] dx = {0, 0, -1, 1}; // ์ด์ ๋ณํ๋
static int[] dy = {-1, 1, 0, 0}; // ํ์ ๋ณํ๋
// BFS ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋ฉ์๋๋ฅผ ์ ์ (๋งค๊ฐ๋ณ์๋ก ๋ํ์ง์ ์ ๋ณด์ธ ๋ฐฐ์ด arr๊ณผ ์์์ ์ ํ๊ณผ ์ด์ ๋ฐ์)
static int bfs(int[][] arr, int x, int y) {
// ํ ์์ฑ (ํ๊ณผ ์ด์ ์ ๋ณด๋ฅผ ๋ด์ ์ขํ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ)
Queue<Coord> queue = new LinkedList<>();
// ์์์ ์ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํ๊ธฐ ์ํด ๊ฐ์ 0์ผ๋ก ๋ณ๊ฒฝ
queue.add(new Coord(x, y));
arr[x][y] = 0;
// ์ฐ๊ฒฐ๋ ์์น ๋ ๋ถ๋ถ์ ๊ฐ์๋ฅผ ์ ์ฅํ ๋ณ์๋ฅผ ๋ง๋ฆ (์ด๊ธฐ๊ฐ์ 1 (์์์ ํฌํจ))
int count = 1;
// ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while (!queue.isEmpty()) {
// ํ์์ ํ๋์ ์ขํ ๊ฐ์ฒด๋ฅผ ๊บผ๋
Coord coord = queue.poll();
// ์ํ์ข์ฐ๋ก ์ด๋ํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ฐ๋ณต๋ฌธ์ ๋๋ค.
for (int i = 0; i < 4; i++) {
// ํ์ฌ ์ขํ์์ ์ด๋ํ ์ขํ ๊ณ์ฐ
int nx = coord.x + dx[i];
int ny = coord.y + dy[i];
// ์ด๋ํ ์ขํ๊ฐ ๋ํ์ง ๋ฒ์ ์์ ์๊ณ ์์น ๋ ๋ถ๋ถ์ด๋ผ๋ฉด
if (nx >= 0 && nx < arr.length && ny >= 0 && ny < arr[0].length && arr[nx][ny] == 1) {
// ๊ทธ ์ขํ๋ฅผ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํ๊ธฐ ์ํด ๊ฐ์ 0์ผ๋ก ๋ณ๊ฒฝ
queue.add(new Coord(nx, ny));
arr[nx][ny] = 0;
// ์ฐ๊ฒฐ๋ ์์น ๋ ๋ถ๋ถ์ ๊ฐ์๋ฅผ ํ๋ ์ฆ๊ฐ์ํด
count++;
}
}
}
// ์ต์ข
์ ์ผ๋ก ๊ตฌํ ์ฐ๊ฒฐ๋ ์์น ๋ ๋ถ๋ถ์ ๊ฐ์๋ฅผ ๋ฆฌํด
return count;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// ๋ํ์ง์ ์ธ๋ก ํฌ๊ธฐ n๊ณผ ๊ฐ๋ก ํฌ๊ธฐ m์ ์
๋ ฅ๋ฐ์
int n = sc.nextInt();
int m = sc.nextInt();
// ๋ํ์ง ์ ๋ณด๊ฐ ๋ค์ด๊ฐ n x m ํฌ๊ธฐ์ ๋ฐฐ์ด ์์ฑ
int[][] arr = new int[n][m];
// ๋ ๋ฒ์งธ ์ค๋ถํฐ n+1 ์ค๊น์ง ๊ทธ๋ฆผ ์ ๋ณด(0๊ณผ 1)์ ์
๋ ฅ๋ฐ์ ๋ฐฐ์ด์ ์ ์ฅ
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = sc.nextInt();
}
}
// ๊ทธ๋ฆผ์ ๊ฐ์๋ฅผ ์ ์ฅํ ๋ณ์ (์ด๊ธฐ๊ฐ 0)
int picture = 0;
// ๊ทธ๋ฆผ์ ์ต๋ ๋์ด๋ฅผ ์ ์ฅํ ๋ณ์ (์ด๊ธฐ๊ฐ 0)
int maxArea = 0;
// ๋ํ์ง ์ ์ฒด๋ฅผ ํ์ํ๊ธฐ ์ํด ์ด์ค ๋ฐ๋ณต๋ฌธ์ ๋๋ค.
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
// ์์น ๋ ๋ถ๋ถ์ด๋ผ๋ฉด
if (arr[i][j] == 1) {
// ๊ทธ๋ฆผ์ ๊ฐ์๋ฅผ ํ๋ ์ฆ๊ฐ์ํด
picture++;
// ์ฐ๊ฒฐ๋ ์์น ๋ ๋ถ๋ถ์ ๊ฐ์๋ฅผ ๊ตฌํ๊ณ ์ต๋ ๋์ด์ ๋น๊ตํ์ฌ ๊ฐฑ์
maxArea = Math.max(maxArea, bfs(arr,i,j));
}
}
}
System.out.println(picture); // ๊ทธ๋ฆผ์ ๊ฐ์
System.out.println(maxArea); // ์ต๋ ๋์ด
sc.close();
}
}
'๐ Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2828 ์ฌ๊ณผ ๋ด๊ธฐ ๊ฒ์(JAVA) (0) | 2023.04.02 |
---|---|
[๋ฐฑ์ค] 2178 ๋ฏธ๋ก ํ์(JAVA) (0) | 2023.03.27 |
8958 (0) | 2021.08.18 |
1110 (0) | 2021.08.16 |
10952 10951 (0) | 2021.08.15 |