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

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


1. ๋ฌธ์ œ ์š”์•ฝ

NxNํฌ๊ธฐ map์ด ์ฃผ์–ด์ง„๋‹ค.

๋“ฑ์‚ฐ๋กœ๋Š” ๊ฐ€์žฅ ๋†’์€ ๋ด‰์šฐ๋ฆฌ์—์„œ ์‹œ์ž‘๋˜๋ฉฐ, ์‚ฌ๋ฐฉํƒ์ƒ‰์œผ๋กœ ๋†’์ด๊ฐ€ ์ž‘์€ ์ขŒํ‘œ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฑ ํ•œ ๊ณณ์€ K๋†’์ด ์ดํ•˜ ๋งŒํผ ๊นŽ๋Š” ๊ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋•Œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ๋“ฑ์‚ฐ๋กœ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

2. ํ’€์ด

dfs๋กœ ํ’€์—ˆ๋‹ค. 

1. ์ตœ๋Œ€ ๋†’์ด๋Š” ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ๊ฐฑ์‹ ํ•ด์ฃผ์—ˆ๋‹ค.

2. ๊ฐ€์žฅ ๋†’์€ ์œ„์น˜๋Š” ํ์— ์ขŒํ‘œ ์ €์žฅํ•œ๋‹ค.

3. ํ•ด๋‹น ์ขŒํ‘œ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ธธ์„ ํƒ์ƒ‰ํ•œ๋‹ค. => dfs

   - ๋ฒ”์œ„ ์•ˆ์— ๋“ค ๊ฒฝ์šฐ,

        - ๋‹ค์Œ ์œ„์น˜์˜ ๋†’์ด๊ฐ€ ํ˜„์žฌ ๋†’์ด๋ณด๋‹ค ์ž‘์œผ๋ฉด dfs ๋Œ๋Ÿฌ ๊ฐ„๋‹ค

        - ๋‹ค์Œ ์œ„์น˜์˜ ๋†’์ด๊ฐ€ ํ˜„์žฌ ๋†’์ด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด,

            ๊ณต์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š์•˜๊ณ , ๋‘ ๋†’์ด์˜ ์ฐจ๊ฐ€ K๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋†’์ด๋ฅผ ๊นŽ์•„ ํ˜„์žฌ๋†’์ด-1 ๋กœ ๋งŒ๋“ค๊ณ  dfs๋ฅผ ๋ˆ๋‹ค.

* ๋ฐฉ๋ฌธํ•œ ์ง€์ ์€ visited๋ฅผ true๋กœํ•ด์ฃผ๊ณ , dfs๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ๋„ ๊ฐ€๋ด์•ผํ•˜๋ฏ€๋กœ visited๋ฅผ false๋กœ ์›๋ณต์‹œํ‚จ๋‹ค.

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€, ์‹œ์ž‘์ ์„ visitedํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค.

๊ฒฝ๋กœ๋ฅผ ์ญ‰ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ์‹œ์ž‘์ ์„ ๋งŒ๋‚ฌ์„ ๋•Œ, K๋งŒํผ ๊นŽ์•„๋ณด๊ณ  ๊นŽ์ด๋ฉด dfs๋ฅผ ๋„๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.

์‹œ์ž‘์ง€์ ๋„ ์•ž ๋’ค๋กœ visited ์ฒดํฌ๋ฅผ ํ•ด์ฃผ๋‹ˆ ํ†ต๊ณผํ•˜์˜€๋‹ค.

 

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
package a22_11_08;

import java.io.*;
import java.util.*;

public class SW_1949_๋“ฑ์‚ฐ๋กœ์กฐ์„ฑ {

	static int N, K, ans, max;
	static int[][] map;
	static boolean[][] visited;
	static Queue<Pos> starts;
	
	static int[] dy= {-1,1,0,0};
	static int[] dx= {0,0,-1,1};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int T = Integer.parseInt(br.readLine());
		
		for (int tc=1; tc<=T; tc++) {
			
			st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			
			map = new int[N][N];
			visited = new boolean[N][N];
			starts = new ArrayDeque<> ();
			
			max = 0;
			for (int i=0; i<N; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j=0; j<N; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
					max = Math.max(max, map[i][j]);
				}
			} //์ž…๋ ฅ ๋
			
			for (int i=0; i<N; i++) {
				for (int j=0; j<N; j++) {
					if (map[i][j] == max) {
						starts.offer(new Pos(i, j));
					}
				}
			} //์‹œ์ž‘์  ์…‹ํŒ…
			
			ans = 0;
			solution();
			System.out.println("#"+tc+" "+ans);
		}
	}
	
	static void solution() {
		while (!starts.isEmpty()) {
			Pos start = starts.poll();
			visited[start.y][start.x] = true;
			dfs(start.y, start.x, 1, false, max);
			visited[start.y][start.x] = false;
			
		}
	}
	
	static void dfs(int y, int x, int dep, boolean used, int now) {
		ans = Math.max(ans, dep);
		for (int d=0; d<4; d++) {
			int ny = y+dy[d];
			int nx = x+dx[d];
			if (ny<0||ny>=N||nx<0||nx>=N||visited[ny][nx]) continue;
			
			if (map[ny][nx] < now) {
				visited[ny][nx] = true;
				dfs(ny, nx, dep+1, used, map[ny][nx]);
				visited[ny][nx] = false;
			} else {
				if (used == false) {
					if (map[ny][nx] - now < K) {
						visited[ny][nx] = true;
						dfs(ny, nx, dep+1, true, now-1);
						visited[ny][nx] = false;
					}
				}
			}
			
		}
		
	}
	
	static class Pos {
		int y, x;
		Pos(int y, int x) {
			this.y = y;
			this.x = x;
		}
	}
}