๋งํฌ
https://www.acmicpc.net/problem/2573
๋ฌธ์ ์์ฝ
N*M ํฌ๊ธฐ ๋ฐฐ์ด์ ๊ฐ ์นธ์๋ ๋น์ฐ ๋๋ ๋ฐ๋ค(0)๊ฐ ์๋ค.
๊ฐ ๋น์ฐ ์นธ์๋ ๋น์ฐ์ ๋์ด ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
๋์๋จ๋ถ์ผ๋ก ๋ถ์ด์๋ ์นธ๋ค์ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ํ ๋ฉ์ด๋ฆฌ๋ก ์ทจ๊ธํ๋ค.
๋น์ฐ์ ๋์ด๋ ์ผ ๋ ๋ง๋ค ๋์๋จ๋ถ ๋ค ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ค๊ฐ ์ ํด์๋ ๊ฐ์๋งํผ ์ค์ด๋ ๋ค.
์ฒ์์ ํ ๋ฉ์ด๋ฆฌ์ ๋น์ฐ์ด ์ฃผ์ด์ง ๋, ์ด ๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ ) ๊ตฌํ๊ธฐ
์ ํ
- ์ฒซ ์ค์๋ ์ด์ฐจ์ ๋ฐฐ์ด์ ํ์ ๊ฐ์์ ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N๊ณผ M์ด ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
- N๊ณผ M์ 3 ์ด์ 300 ์ดํ์ด๋ค.
- ๊ทธ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๋ฐฐ์ด์ ๊ฐ ํ์ ๋ํ๋ด๋ M๊ฐ์ ์ ์๊ฐ ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
- ๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ๊ฐ์ 0 ์ด์ 10 ์ดํ์ด๋ค.
- ๋ฐฐ์ด์์ ๋น์ฐ์ด ์ฐจ์งํ๋ ์นธ์ ๊ฐ์, ์ฆ, 1 ์ด์์ ์ ์๊ฐ ๋ค์ด๊ฐ๋ ์นธ์ ๊ฐ์๋ 10,000 ๊ฐ ์ดํ์ด๋ค.
- ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ๊ณผ ์ด, ๋ง์ง๋ง ํ๊ณผ ์ด์๋ ํญ์ 0์ผ๋ก ์ฑ์์ง๋ค.
- ๋ง์ผ ๋น์ฐ์ด ๋ค ๋ น์ ๋๊น์ง ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
ํ์ด
๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋์ง ์ฌ๋ถ๋ ๊ฒฐ๊ตญ ์์ญ์ด ๋ ๊ฐ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋์ง์ ๋๋ค.
๋ฐ๋ผ์ BFS๋ DFS๋ก ๋ฌธ์ ๋ฅผ ํ ์ ์์ต๋๋ค.
์ ๋ DFS๋ก ํ์์ต๋๋ค.
- ์ฒ์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ฌด์กฐ๊ฑด ํ ๋ฉ์ด๋ฆฌ์ ๋น์ฐ์ด๋ฏ๋ก, ๋น์ฐ ๊ฐ์๋ฅผ ์นด์ดํธํ์ง ์๊ณ ๋ น์ธ๋ค.
- ์ ์ฒด ๋ฐฐ์ด์ ๋ํด 0์ด ์๋ ๋ฐฐ์ด ์นธ์ ๊ธฐ์ค์ผ๋ก ๋์๋จ๋ถ ๋ฐฉํฅ 0์ ๊ฐ์๋ฅผ ์ผ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ ์ ์ฅํ๋ค.
- ๋น์ฐ ๋
น์ด๊ธฐ
- ๋ค์ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ 0์ด ์๋ ์นธ์ ๊ธฐ์ค์ผ๋ก, 2์์ ์ ์ฅํ๋ ์ฃผ๋ณ 0์ ๊ฐ์๋งํผ ๊ฐ์ ๊ฐ์์ํจ๋ค.
- ๋จ, ๊ฐ์ ์์๊ฐ ๋ ์ ์๋ค. ์ต์๊ฐ 0์ ๋๊ธฐ์ง ์๋๋ก ํ๋ค.
- ์ ์ฒด ๋ฐฐ์ด์ ๋ํด ์ํํ๋ค.
- ์๊ฐ(๋ )์ 1 ์ฆ๊ฐ์ํจ๋ค.
- ๋ค์ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ 0์ด ์๋ ์นธ์ ๊ธฐ์ค์ผ๋ก, 2์์ ์ ์ฅํ๋ ์ฃผ๋ณ 0์ ๊ฐ์๋งํผ ๊ฐ์ ๊ฐ์์ํจ๋ค.
- ๋น์ฐ ๊ฐ์ ์นด์ดํธํ๊ธฐ
- ๋ฐฐ์ด์์ 0์ด๊ณผ์ธ ์นธ์ ์์์ ์ผ๋ก ์ก๋๋ค.
- ์์์ ์ ๊ธฐ์ค์ผ๋ก ๋์๋จ๋ถ์ ํ์ํ๋ค.
- ๊ฐ์ด 0 ์ด๊ณผ์ด๊ณ ๊ฒฝ๊ณ๊ฐ์ ๋์ง ์์ผ๋ฉฐ, ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ด ์๋๋ผ๋ฉด ์๋ก ํ์ํ๋ค.
- ํ์ํ ๋๋ง๋ค ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์๋ฅผ ๋จ๊ธฐ๊ณ ๋ ์ด์ ์ฐ์์ ์ผ๋ก ํ์ ๊ฐ๋ฅํ ์นธ์ด ์์ ๋, ํ์์ด ๋๋๋ค.
- ๋ค์ ํ์ ์์์ ์ ์ฐพ์ ๋ฐฐ์ด ์ ์ฒด์ ๋ํด 4๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๋น์ฐ์ ๊ฐ์๊ฐ 0๊ฐ์ด๊ฑฐ๋ 2๊ฐ ์ด์์ด ์๋๋ฉด, 2๋ฒ์ผ๋ก ๋์๊ฐ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ์กฐ๊ฑด์ ๋ง์กฑํด ๋ฐ๋ณต์ด ๋๋๋ฉด, ๊ฑธ๋ฆฐ ์๊ฐ(๋ )์ ์ถ๋ ฅํ๋ค.
์ฝ๋
๐จ [1์ฐจ] - ํ๋ฆผ
import java.util.*;
import java.io.*;
public class Main {
static int[][] board;
static int[][] zeroCnt;
static boolean[][] visited;
static int cnt= 1;
static int[] dirx = {1,0,-1,0};
static int[] diry = {0,1,0,-1};
static int n, m;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
board = new int[n][m];
int year = 0;
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++){
board[i][j] = Integer.parseInt(st.nextToken());
}
}
while(cnt>0 && cnt<2){
// ์ฃผ๋ณ 0 ๊ฐ์ ์นด์ดํธ
zeroCnt = new int[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(board[i][j]>0 && zeroCnt[i][j]==0){
int tempCnt = 0;
for(int k=0; k<dirx.length; k++){
int nx = i+dirx[k];
int ny = j+diry[k];
if(nx>=0 && nx<n && ny>=0 && ny<m && board[nx][ny]==0) tempCnt++;
}
zeroCnt[i][j] = tempCnt;
}
}
}
// ๋น์ฐ ๋
น์ด๊ธฐ
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(board[i][j]>0 && zeroCnt[i][j]>0){
board[i][j]=Math.max(0,board[i][j]-zeroCnt[i][j]);
}
}
}
year++;
// ๋น์ฐ ๊ฐ์ ์นด์ดํธ
cnt=0;
visited = new boolean[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(board[i][j]>0 && !visited[i][j]){
cnt++;
dfs(i,j);
}
}
}
}
System.out.print(cnt==0 ? 0:year);
}
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>=n||ny>=m) continue;
if(visited[nx][ny] || board[nx][ny]==0) continue;
dfs(nx,ny);
}
}
}
๐ท [๋ฌธ์ ์ ]
- ์ฒ์์ ํ๋์ ์นธ์ ํ์ํ ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์๋ง ํด์ฃผ๋ฉด 1๋ ๋์์ ๋ค์ ์ด ์นธ์ ํ์ํ ์ผ์ด ์๋ค๊ณ ์๊ฐํ์ฌ ํ์๊ณผ ๋์์ ๊ฐ ์นธ์ ๊ฐ์ -1 ํด์ฃผ์์ต๋๋ค.
- ํ์ง๋ง ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๋ฐ๋ก ์ ์นธ์ ๋น์ฐ์์ ์ค์ด๋ค ๋์ด๋ฅผ ์ ํ ๋ ์ํฅ์ ๋ผ์น๊ฒ ๋ฉ๋๋ค!
- ex) ๊ฐ๋จํ๊ฒ [1,2,0]์์ 1์ ๋จผ์ ํ์ํ์ฌ 1->0์ด ๋๋ฉด, 2๋ฅผ ํ์ํ ๋ 2 ->1์ด ๋ง์ง๋ง 2->0์ด ๋ผ๋ฒ๋ฆฝ๋๋ค.
- ์ ์ฝ๋๋ ์ฐ์ฐํ ์ฃผ์ด์ง ์์ ์ถ๋ ฅ์ด ๋ง์์ ์ ์ถํ๋ค๊ฐ ํ๋ ธ์ต๋๋ค ๐คฃ
๐ท [ํด๊ฒฐ๋ฒ]
- 0์ด ์๋ ๊ฐ ์นธ์ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ 0์ ๊ฐ์๋ฅผ ์นด์ดํธํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅํ ํ, ์ ์ฅํ ๊ฐ์ ๋ฐํ์ผ๋ก ๋น์ฐ ๋ น์ด๊ธฐ๋ฅผ ์งํํด์ผ ํฉ๋๋ค.
- ์๋๋ฉด ์ฃผ๋ณ 0์ ๊ฐ์๋ฅผ ์นด์ดํธํ ํ ๋น์ฐ์ด ๋ น์ ํ์ ๊ฐ์ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅํ๊ณ , ์๋ก์ด ๋ฐฐ์ด์ ๋ชจ๋ ์ฑ์ด ํ ์ด๊ฑธ ๊ฐ์ง๊ณ ๊ธฐ์กด ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํฉ๋๋ค.
⇒ ์ด์จ๋ ๋น์ฐ์ ๋ น์ด๋ ๊ณผ์ ์์ ์๋ก์ด ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ, ๋ น์ ๋น์ฐ ์นธ์ด ์์ง ๋ น์ง ์์ ๋น์ฐ ์นธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํฉ๋๋ค!
โ [์ต์ข ]
import java.util.*;
import java.io.*;
public class Main {
static int[][] board;
static int[][] zeroCnt;
static boolean[][] visited;
static int cnt= 1;
static int[] dirx = {1,0,-1,0};
static int[] diry = {0,1,0,-1};
static int n, m;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
board = new int[n][m];
int year = 0;
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++){
board[i][j] = Integer.parseInt(st.nextToken());
}
}
while(cnt>0 && cnt<2){
// ์ฃผ๋ณ 0 ๊ฐ์ ์นด์ดํธ
zeroCnt = new int[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(board[i][j]>0 && zeroCnt[i][j]==0){
int tempCnt = 0;
for(int k=0; k<dirx.length; k++){
int nx = i+dirx[k];
int ny = j+diry[k];
if(nx>=0 && nx<n && ny>=0 && ny<m && board[nx][ny]==0) tempCnt++;
}
zeroCnt[i][j] = tempCnt;
}
}
}
// ๋น์ฐ ๋
น์ด๊ธฐ
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(board[i][j]>0 && zeroCnt[i][j]>0){
board[i][j]=Math.max(0,board[i][j]-zeroCnt[i][j]);
}
}
}
year++;
// ๋น์ฐ ๊ฐ์ ์นด์ดํธ
cnt=0;
visited = new boolean[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(board[i][j]>0 && !visited[i][j]){
cnt++;
dfs(i,j);
}
}
}
}
System.out.print(cnt==0 ? 0:year);
}
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>=n||ny>=m) continue;
if(visited[nx][ny] || board[nx][ny]==0) continue;
dfs(nx,ny);
}
}
}
๐ท ์๊ฐ ๋ณต์ก๋
- board์ ํฌ๊ธฐ: `N`*`M`
- ์ฃผ๋ณ 0 ๊ฐ์ ์นด์ดํธ: `O(N*M)`
- ๋น์ฐ ๋ น์ด๊ธฐ: `O(N*M)`
- ๋น์ฐ ๊ฐ์ ์นด์ดํธ: `O(N*M)`
- dfs ํจ์: ์ต๋ `N`*`M`๋ฒ ํธ์ถ
- ์ต์ข ์๊ฐ ๋ณต์ก๋: `O(NM)`+`O(NM)`+`O(NM)` = `O(NM)`
๐ท ์คํ ์๋
Time: 484 ms, Memory: 135348 KB
'๐ช Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/๋ฐฑ์ค] 2178 ๋ฏธ๋ก ํ์(JAVA) (1) | 2025.02.11 |
---|---|
[BOJ/๋ฐฑ์ค] 1931 ํ์์ค ๋ฐฐ์ (JAVA) (1) | 2025.02.10 |
[BOJ/๋ฐฑ์ค] 4963. ์ฌ์ ๊ฐ์ (JAVA) (1) | 2025.02.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ฒ์ (JAVA) (1) | 2025.02.06 |