๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 2468๋ฒˆ: ์•ˆ์ „ ์˜์—ญ(์™„์ „ํƒ์ƒ‰, ๊ทธ๋ž˜ํ”„)

by ์ฃผ๋ฐœ2 2020. 2. 12.
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/2468

 

2468๋ฒˆ: ์•ˆ์ „ ์˜์—ญ

์žฌ๋‚œ๋ฐฉ์žฌ์ฒญ์—์„œ๋Š” ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ฆฌ๋Š” ์žฅ๋งˆ์ฒ ์— ๋Œ€๋น„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ๊ณ„ํšํ•˜๊ณ  ์žˆ๋‹ค. ๋จผ์ € ์–ด๋–ค ์ง€์—ญ์˜ ๋†’์ด ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ๊ทธ ์ง€์—ญ์— ๋งŽ์€ ๋น„๊ฐ€ ๋‚ด๋ ธ์„ ๋•Œ ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์˜์—ญ์ด ์ตœ๋Œ€๋กœ ๋ช‡ ๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด ์ง€๋Š” ์ง€๋ฅผ ์กฐ์‚ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ, ์žฅ๋งˆ์ฒ ์— ๋‚ด๋ฆฌ๋Š” ๋น„์˜ ์–‘์— ๋”ฐ๋ผ ์ผ์ •ํ•œ ๋†’์ด ์ดํ•˜์˜ ๋ชจ๋“  ์ง€์ ์€ ๋ฌผ์— ์ž ๊ธด๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์–ด๋–ค ์ง€์—ญ์˜ ๋†’์ด ์ •๋ณด๋Š” ํ–‰๊ณผ ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ๊ฐ N์ธ 2์ฐจ์› ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ฃผ์–ด

www.acmicpc.net

์ฝ”๋“œ

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 ํ˜ธ์ถœ
		}
	}
}

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€