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

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€ ์Šคํ„ฐ๋”” 11์ฃผ์ฐจ] 14500๋ฒˆ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ๊ณจ๋“œ5 - ์ž๋ฐ”(JAVA) / ๊ตฌํ˜„, ์™„์ „ํƒ์ƒ‰

๐Ÿ“‘ ๋ฌธ์ œ

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

 

14500๋ฒˆ: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์€ ์„œ๋กœ ๊ฒน์น˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋„ํ˜•์€ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€

www.acmicpc.net

๋”๋ณด๊ธฐ
๋”๋ณด๊ธฐ

๋ฌธ์ œ

ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  • ์ •์‚ฌ๊ฐํ˜•์€ ์„œ๋กœ ๊ฒน์น˜๋ฉด ์•ˆ ๋œ๋‹ค.
  • ๋„ํ˜•์€ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ผญ์ง“์ ๊ณผ ๊ผญ์ง“์ ๋งŒ ๋งž๋‹ฟ์•„ ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค.

์ •์‚ฌ๊ฐํ˜• 4๊ฐœ๋ฅผ ์ด์–ด ๋ถ™์ธ ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋Š” ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ผ๊ณ  ํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ 5๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์•„๋ฆ„์ด๋Š” ํฌ๊ธฐ๊ฐ€ N×M์ธ ์ข…์ด ์œ„์— ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ํ•˜๋‚˜๋ฅผ ๋†“์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์ข…์ด๋Š” 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์นธ์—๋Š” ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์“ฐ์—ฌ ์žˆ๋‹ค.

ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ํ•˜๋‚˜๋ฅผ ์ ์ ˆํžˆ ๋†“์•„์„œ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๊ฐ€ ๋†“์ธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋“ค์˜ ํ•ฉ์„ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋Š” ๋ฐ˜๋“œ์‹œ ํ•œ ์ •์‚ฌ๊ฐํ˜•์ด ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์นธ์„ ํฌํ•จํ•˜๋„๋ก ๋†“์•„์•ผ ํ•˜๋ฉฐ, ํšŒ์ „์ด๋‚˜ ๋Œ€์นญ์„ ์‹œ์ผœ๋„ ๋œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ข…์ด์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (4 ≤ N, M ≤ 500)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ข…์ด์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. i๋ฒˆ์งธ ์ค„์˜ j๋ฒˆ์งธ ์ˆ˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ i๋ฒˆ์งธ ์นธ, ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ j๋ฒˆ์งธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜์ด๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์ˆ˜๋Š” 1,000์„ ๋„˜์ง€ ์•Š๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๊ฐ€ ๋†“์ธ ์นธ์— ์“ฐ์ธ ์ˆ˜๋“ค์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

 

 

 

 

 

 

โœ’๏ธ ํ’€์ด

 ์ด ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐธ๊ณ ๋ฅผ ์กฐ๊ธˆ ํ–ˆ๋‹ค ใ… ใ… 

 ์™„์ „ํƒ์ƒ‰์œผ๋กœ ๊ฐ€์•ผํ•˜๋Š”์ง€ ๊ณ ๋ฏผ์ด ๋งŽ์•˜๋Š”๋ฐ ๊ฒฐ๊ตญ์€ ๋งž์•˜๋‹ค. ๋‹จ ์•„์ด๋””์–ด๊ฐ€ ํ•˜๋‚˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ’ก "ใ…—"์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ชจ์–‘์€ ๊นŠ์ด๊ฐ€ 4์ธ DFS๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ชจ์–‘์ด๋‹ค.

 

 ์ด ์•„์ด๋””์–ด๋งŒ ์ฐธ๊ณ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ์œ„์น˜์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊นŠ์ด 4์ธ ๋ชจ๋“  DFS ๋ฃจํŠธ๋ฅผ ํ™•์ธํ•œ ํ›„, ๊ทธ ์ค‘์—์„œ๋„ ๊ฐ€์ค‘์น˜๊ฐ€ ์ตœ๊ณ ์ธ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

 ์ดํ›„ ์˜ˆ์™ธ์‚ฌํ•ญ์ธ "ใ…—" ๋ชจ์–‘๋งŒ ๋”ฐ๋กœ ์ฒดํฌํ•ด์ค€๋‹ค. "ใ…—" ๋ชจ์–‘์˜ ๊ฒฝ์šฐ ์‚ฌ๋ฐฉํƒ์ƒ‰์—์„œ ์ด๊ฐ€ ํ•˜๋‚˜ ๋น ์ง„ ๊ฒƒ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

๐Ÿ’ป ์†Œ์Šค์ฝ”๋“œ: ์ž๋ฐ”(Java)

public class Main_๋ฐฑ์ค€_14500_ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ_๊ณจ๋“œV {

	static int N, M, result=Integer.MIN_VALUE;
	static int[] dx = {1,-1,0,0};
	static int[] dy = {0,0,1,-1};
	static boolean[][] visited;
	static int[][] map;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		map = new int[N][M];
		visited = new boolean[N][M];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}//input
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				dfs(i,j,0,0);
				exception(i, j);
			}
		}
		System.out.println(result);
	}//end of main
	
	private static void dfs(int x, int y, int cnt, int sum) {
		if(cnt==4) {
			result = Math.max(result, sum);
			return;
		}
		
		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>=M||visited[nx][ny]) continue;
			visited[nx][ny] = true;
			dfs(nx, ny, cnt+1, sum+map[nx][ny]);
			visited[nx][ny] = false;
		}
	}//end of dfs
	
	private static void exception(int x, int y) {
		
		int nx, ny, wing = 0, sum = map[x][y];
		for (int i = 0; i < 4; i++) {
			nx = x + dx[i];
			ny = y + dy[i];
			if(nx<0||ny<0||nx>=N||ny>=M) continue;
			sum += map[nx][ny];
			wing++;
		}
		if(wing==3) result = Math.max(result, sum);
		else if(wing==4) {
			for (int i = 0; i < 4; i++) {
				nx = x + dx[i];
				ny = y + dy[i];
				result = Math.max(result, sum-map[nx][ny]);
			}
		}
	}//end of exception
}//end of class

 

 

 

 

 

 

 

 

 

 

 

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ