λ°μν
λ§ν¬
https://www.acmicpc.net/problem/4963
λ¬Έμ μμ½
h*w μ¬κ°ν μ§λμ μ¬ λλ λ°λ€κ° νμλμ΄ μμ λ μ¬μ κ°μλ₯Ό λ°ννκΈ°
μ΄λ κ°λ‘, μΈλ‘, λκ°μ μΌλ‘ μ°κ²°λμ΄ μλ μ¬μ κ°μ μ¬μ΄λ€.
μ ν
- μ
λ ₯μ μ¬λ¬ κ°μ ν
μ€νΈ μΌμ΄μ€λ‘ μ΄λ£¨μ΄μ Έ μλ€. κ° ν
μ€νΈ μΌμ΄μ€μ 첫째 μ€μλ μ§λμ λλΉ wμ λμ΄ hκ° μ£Όμ΄μ§λ€.
- wμ hλ 50λ³΄λ€ μκ±°λ κ°μ μμ μ μμ΄λ€.
- λμ§Έ μ€λΆν° hκ° μ€μλ μ§λκ° μ£Όμ΄μ§λ€.
- 1μ λ , 0μ λ°λ€μ΄λ€.
- μ λ ₯μ λ§μ§λ§ μ€μλ 0μ΄ λ κ° μ£Όμ΄μ§λ€.
- wμ hλ 50λ³΄λ€ μκ±°λ κ°μ μμ μ μμ΄λ€.
νμ΄
κ°λ‘, μΈλ‘, λκ°μ μΌλ‘ μ°κ²°λμ΄ μμ§ μμ 1μ κ°μλ₯Ό μΈλ λ¬Έμ μ λλ€.
μ¦, μμμ κ°μλ₯Ό ꡬνλ λ¬Έμ μ΄λ―λ‘ DFS λλ BFSλ‘ ν μ μμ΅λλ€.
μ λ DFSλ‘ λ¬Έμ λ₯Ό νμμ΅λλ€.
- μμμ μΌλ‘λΆν° κ°λ‘, μΈλ‘, λκ°μ λ°©ν₯μΌλ‘ νμ κ°λ₯ν λͺ¨λ λ
(1) μΉΈμ μ°Ύλλ€.
- μμ§ λ°©λ¬Ένμ§ μμ λ (1)λ§ μμμ μ΄ λ μ μλ€.
- μμμ κ·Όμ²μ λ (1) μΉΈμ λ°κ²¬λ©΄, λ€μ κΈ°μ€μ μ ν΄λΉ μΉΈμΌλ‘ μ§μ νμ¬ μ°μμ μΌλ‘ νμνλ€.
- κ° μΉΈμ λ°©λ¬Έ νμλ₯Ό λ¨κΈ΄λ€.
- λ μ΄μ νμ κ°λ₯ν λ (1) μΉΈμ΄ μμΌλ©΄, νλμ μ¬ μμμ λν νμμ΄ μλ£λ κ²μ΄λ€.
- λ€μ μμμ μ κΈ°μ€μΌλ‘ 1~3κ³Όμ μ λ°λ³΅νλ€.
- κ° μμμ λ§λ€ μ¬ κ°μ μΉ΄μ΄νΈλ₯Ό 1 μ¦κ°μν¨λ€.
νμ κ°λ₯ν μμμ κΈ°μ€μ λ€μ 3κ°μ§ κΈ°μ€μ λͺ¨λ λ§μ‘±ν΄μΌ ν©λλ€.
- μ§λ λ²μ λ΄λΆμ¬μΌ νλ€.(μ§λ λ²μ λ°μ΄λ©΄ λ°νμ μλ¬ λ°μ κ°λ₯)
- κ°μ΄ 1μ΄μ΄μΌ νλ€.(=λ°λ€κ° μλ μ¬μ΄μ΄μΌ νλ€)
- μ΄μ μ λ°©λ¬Έν μ μ΄ μλ μμμ΄μ΄μΌ νλ€.
⇒ μ΄ μ‘°κ±΄λ€μ μ κ³ λ €νμ¬ λ¬Έμ λ₯Ό νμ΄μΌ ν©λλ€!
μ½λ
import java.util.*;
import java.io.*;
public class Main {
static boolean[][] visited;
static int[][] board;
static int cnt;
static int[] dirX = {1,0,-1,0,1,-1,-1,1};
static int[] dirY = {0,1,0,-1,1,1,-1,-1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
while(true) {
cnt = 0;
st = new StringTokenizer(br.readLine());
int w = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
if (w == 0 && h == 0) return;
visited = new boolean[h][w];
board = new int[h][w];
for(int i=0; i<h; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<w; j++){
board[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
if(!visited[i][j] && board[i][j]==1) {
dfs(i,j);
cnt++;
}
}
}
System.out.println(cnt);
}
}
static void dfs(int curx, int cury){
visited[curx][cury] = true;
for(int i=0; i<dirX.length; i++){
int nx = curx+dirX[i];
int ny = cury+dirY[i];
if(nx<0 || ny<0 || nx>=board.length || ny>=board[0].length) continue;
if(visited[nx][ny] || board[nx][ny]==0) continue;
visited[nx][ny] = true;
dfs(nx,ny);
}
}
}
π· μκ° λ³΅μ‘λ
- 첫 2μ€ forλ¬Έ: `O(h*w)`
- λ λ²μ§Έ 2μ€ forλ¬Έ: `O(h*w)`
- dfs ν¨μκ° μμ§ λ°©λ¬Ένμ§ μμ 1 κ° κ°μλ§νΌ νΈμΆνκ² λλ―λ‘ `O(h*w)`
- 1 κ°(λ ) κ°μλ μ΅λ `h*w`
- dfs ν¨μκ° μμ§ λ°©λ¬Ένμ§ μμ 1 κ° κ°μλ§νΌ νΈμΆνκ² λλ―λ‘ `O(h*w)`
- μ΅μ’
μκ° λ³΅μ‘λ: `O(hw)`+`O(hw)` = `O(h*w)` = `O(N)`
- `N`=`h*w`
- Nμ μ΅λκ°μ 50*50=2500
π· μ€ν μλ
Time: 144 ms, Memory: 15876 KB
λ°μν
'πͺ Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ/λ°±μ€] 1931 νμμ€ λ°°μ (JAVA) (1) | 2025.02.10 |
---|---|
[BOJ/λ°±μ€] 2573 λΉμ° (JAVA) (1) | 2025.02.09 |
[νλ‘κ·Έλλ¨Έμ€] ν¬λ μΈ μΈνλ½κΈ° κ²μ (JAVA) (1) | 2025.02.06 |
[νλ‘κ·Έλλ¨Έμ€] μ£Όμ κ°κ²© (JAVA) (2) | 2025.02.05 |