https://www.acmicpc.net/problem/2468
์ฝ๋
import java.util.Scanner;
public class Main {
static int map[][]; // 2์ฐจ์ ๋ฐฐ์ด
static boolean visit[][]; // ๋ฐฉ๋ฌธํ ์์ญ ํ์ธ
static int[] dx = {0, -1, 0, 1}; // ์ํ์ข์ฐ
static int[] dy = {-1, 0, 1, 0};
static int N; // ๋ฐฐ์ด ์ฌ์ด์ฆ ์
๋ ฅ๋ฐ๋ ๋ณ์
static int safeSpaceMax = 1;
// ๋งค๊ฐ๋ณ์: x์ขํ, y์ขํ, ๋์ด
public static void dfs(int x, int y, int h) {
// x, y ์ขํ๊ฐ ์ง๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์๊ฒฝ์ฐ
if(x<0 || x>=N || y<0 || y>=N)
return;
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น OR ๋์ด ์ดํ(๋ฌผ์ ์ ๊ธด)์ธ ๊ฒฝ์ฐ.
if(visit[x][y] || map[x][y] <=h)
return;
visit[x][y] = true; // ํด๋น x, y์ขํ => ๋ฐฉ๋ฌธ ์ฒดํฌ
for(int i=0; i<4; i++) { // ์ํ์ข์ฐ ํ์ธ
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=0 && ny>=0 && nx<N && ny<N) { // ํด๋น ์ง๋์ ๋ฒ์ ์ด๋ด์ฌ์ผํจ.
if(map[nx][ny] > h && visit[nx][ny] == false) // ์์ ๊ธฐ๋๊ณณ && ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ
dfs(nx, ny, h); // dfs ํธ์ถ
}
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
N = scan.nextInt();
map = new int[N][N];
//visit = new boolean[N][N];
int max = 0; // ์
๋ ฅ๋ฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ ์ค ๋์ด ์ต๋๊ฐ ์ ์ฅ
int result = 1; // ์์ ์์ญ์ด ์ต๋์ธ ๊ฐฏ์(์ถ๋ ฅํ ๋ณ์)
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
map[i][j] = scan.nextInt();
if(map[i][j] > max) // ์ต๋ ๋์ด ์ ์ฅ
max = map[i][j];
}
}
// 1๋ถํฐ ์ต๋ ๋์ด๋งํผ๊น์ง ์์ ์์ญ์ด ์ต๋์ธ ๊ฐฏ์ ์ฐพ๊ธฐ.
for(int i=1; i<=max; i++) {
visit = new boolean[N][N]; // ๊ฐ ๋์ด๋ง๋ค ๋ฐฉ๋ฌธ ์์ญ ์ด๊ธฐํ
int count = 0; // ๊ฐ ๋์ด๋ง๋ค ์์ ์์ญ์ ๊ฐฏ์ ์ด๊ธฐํ
for(int j=0; j<N; j++) {
for(int k=0; k<N; k++) {
// ์ ๊ธฐ์ง ์๋๊ณณ && ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ
if(map[j][k] > i && visit[j][k] == false) {
count ++;
dfs(j, k, i);
}
}
}
// i ๋์ด์ ๋ชจ๋ ํ์์ด ๋๋๋ฉด ์ด์ ๊ณผ ๋น๊ตํด ํฌ๊ธฐ๊ฐ ์ต๋์ธ ์์ญ ๊ตฌํ๊ธฐ.
result = Math.max(result, count);
}
System.out.println(result);
scan.close();
}
}
๋ฌธ์ ์ดํด
- N*N 2์ฐจ์ ๋ฐฐ์ด์์ ํด๋น ๋์ด๋ณด๋ค ๋ฎ๊ฑฐ๋ ๊ฐ์ ์ง์ ์ ๋ฌผ์ ์ ๊ธด๋ค.
- ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์ง์ ๋ค์ด ์ํ์ข์ฐ์ ์ธ์ ํด ์์ผ๋ฉฐ, ๊ทธ ํฌ๊ธฐ๊ฐ ์ต๋์ธ ์์ญ์ด๋ค.
๋ฌธ์ ์์์ฒ๋ผ, ๋ง์ฝ ๋์ด๊ฐ 4 ์ดํ์ธ ์ง์ ์ด ๋ฌผ์ ์ ๊ฒผ๋ค๊ณ ๊ฐ์ ํ์ ๋,
๋ฌธ์ ์์์ฒ๋ผ, ๋ง์ฝ ๋์ด๊ฐ 4 ์ดํ์ธ ์ง์ ์ด ๋ฌผ์ ์ ๊ฒผ๋ค๊ณ ๊ฐ์ ํ์ ๋,
์์ ๊ฐ์ด ๋ฌผ์ ์ ๊ธฐ์ง ์๋ ์์ ํ ์์ญ์ 5๊ฐ๊ฐ ๋๋ค.
ํ์ด
Main()
* ๋จผ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง 2์ฐจ์ ๋ฐฐ์ด ์ค ์ต๋๊ฐ(์ต๋ ๋์ด)๋ฅผ ๊ตฌํ๋ค.
-> 1๋ถํฐ ์ต๋๋์ด๊น์ง ๊ฐ ๋์ด๋ณ ์์ ํ ์์ญ์ ๊ฐฏ์๋ฅผ ๊ตฌํด์ ์ต๋ ์์ญ์ ๊ตฌํ๋ฉด ๋๋ฏ๋ก,,
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
map[i][j] = scan.nextInt();
if(map[i][j] > max) // ์ต๋ ๋์ด ์ ์ฅ
max = map[i][j];
}
}
* ์์์ ๊ตฌํ ์ต๋๋์ด๋ฅผ 1๋ถํฐ ์ต๋๋์ด(max)๊น์ง for๋ฌธ์ ๋๋ฆฐ๋ค.
* ๊ทธ ํ ๊ฐ ๋์ด๋ณ ๋ฐฉ๋ฌธ๋ฐฐ์ด(visit)๋ฅผ ์ด๊ธฐํ ํ๊ณ , ๊ฐ ๋์ด๋ณ ์์ ์์ญ์ ๊ฐฏ์(count)๋ฅผ ์ด๊ธฐํ ํ๋ค.
// 1๋ถํฐ ์ต๋ ๋์ด๋งํผ๊น์ง ์์ ์์ญ์ด ์ต๋์ธ ๊ฐฏ์ ์ฐพ๊ธฐ.
for(int i=1; i<=max; i++) {
visit = new boolean[N][N]; // ๊ฐ ๋์ด๋ง๋ค ๋ฐฉ๋ฌธ ์์ญ ์ด๊ธฐํ
int count = 0; // ๊ฐ ๋์ด๋ง๋ค ์์ ์์ญ์ ๊ฐฏ์ ์ด๊ธฐํ
* ๊ทธ ํ 2์ค for๋ฌธ์ ํตํด ์ ๊ธฐ์ง ์์๊ณณ(2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ์ด ๋์ด๋ณด๋ค ํฐ๊ณณ) && ๋ฐฉ๋ฌธํ์ง ์์๊ณณ์
์ฌ๊ทํธ์ถ์ ํตํด ์ ๊ธฐ์ง ์์๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ๋ชจ๋ ๊ณณ์ ์ฐพ๋๋ค.
for(int j=0; j<N; j++) {
for(int k=0; k<N; k++) {
// ์ ๊ธฐ์ง ์๋๊ณณ && ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ
if(map[j][k] > i && visit[j][k] == false) {
dfs(j, k, i);
count ++;
}
}
}
// i ๋์ด์ ๋ชจ๋ ํ์์ด ๋๋๋ฉด ์ด์ ๊ณผ ๋น๊ตํด ํฌ๊ธฐ๊ฐ ์ต๋์ธ ์์ญ ๊ตฌํ๊ธฐ.
result = Math.max(result, count);
dfs()
* ๋งค๊ฐ๋ณ์ x, y์ขํ๊ฐ ์ง๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ => dfs ์ข ๋ฃ
* ๋งค๊ฐ๋ณ์ x, y์ขํ๊ฐ ๋ฐฉ๋ฌธํ ์์น์ด๊ฑฐ๋ ๋ฌผ์ ์ ๊ธด ๊ฒฝ์ฐ => dfs ์ข ๋ฃ
* ํด๋น ๋งค๊ฐ๋ณ์ => ๋ฐฉ๋ฌธ ์ฒดํฌ
* ์, ํ, ์ข, ์ฐ ์ฒดํฌํ๋ฉฐ ์ง๋์ ๋ฒ์ ์ด๋ด์ด๊ณ , ์์ ๊ธด๊ณณ && ๋ฐฉ๋ฌธํ์ง ์์๊ณณ -> ๊ณ์ํด์ ํ์(์ฌ๊ทํธ์ถ)
// ๋งค๊ฐ๋ณ์: x์ขํ, y์ขํ, ๋์ด
public static void dfs(int x, int y, int h) {
// x, y ์ขํ๊ฐ ์ง๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์๊ฒฝ์ฐ
if(x<0 || x>=N || y<0 || y>=N)
return;
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น OR ๋์ด ์ดํ(๋ฌผ์ ์ ๊ธด)์ธ ๊ฒฝ์ฐ.
if(visit[x][y] || map[x][y] <=h)
return;
visit[x][y] = true; // ํด๋น x, y์ขํ => ๋ฐฉ๋ฌธ ์ฒดํฌ
for(int i=0; i<4; i++) { // ์ํ์ข์ฐ ํ์ธ
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=0 && ny>=0 && nx<N && ny<N) { // ํด๋น ์ง๋์ ๋ฒ์ ์ด๋ด์ฌ์ผํจ.
if(map[nx][ny] > h && visit[nx][ny] == false) // ์์ ๊ธฐ๋๊ณณ && ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ
dfs(nx, ny, h); // dfs ํธ์ถ
}
}
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Codeforces] 791A: Bear and Big Brother (0) | 2020.02.13 |
---|---|
[๋ฐฑ์ค] 1931๋ฒ: ํ์์ค๋ฐฐ์ (๊ทธ๋ฆฌ๋, ์ ๋ ฌ) (0) | 2020.02.12 |
[Codeforces] 1030A: In Search of an Easy Problem (0) | 2020.02.12 |
[Codeforces] 977A: Wrong Subtraction (0) | 2020.02.11 |
[๋ฐฑ์ค] 6603๋ฒ: ๋ก๋(dfs, ๋ฐฑํธ๋ํน) (0) | 2020.02.10 |
๋๊ธ