๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Java Algorithm] ์•„๊ธฐ ์ƒ์–ด BOJ #16236

by seolhee2750 2022. 8. 31.
๋ฌธ์ œ

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

 

16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€

www.acmicpc.net

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;

public class BOJ_16236 {

	static int n;
	static int[][] map;
	static int[] start;
	static int cnt, shark, ans;
	static int[] dx = {0, 0, -1, 1};
	static int[] dy = {-1, 1, 0, 0};

	public static int[] bfs(Deque<int[]> que, int[][] visited, int[] fish) {
		while(!que.isEmpty()) {
			int now[] = que.removeFirst();
			int x = now[0];
			int y = now[1];

			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 || map[nx][ny] > shark || visited[nx][ny] > 0) continue;
				visited[nx][ny] = visited[x][y] + 1;

				if(map[nx][ny] < shark && map[nx][ny] > 0) { // ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ ๋งŒ๋‚ฌ์„ ๋•Œ => ๊ธฐ์กด์— ๋จน์œผ๋ ค๊ณ  ํ–ˆ๋˜ ๋ฌผ๊ณ ๊ธฐ๋ณด๋‹ค ์ ํ•ฉํ•œ์ง€ ํ™•์ธ ํ›„, ๋จน์„ ๋ฌผ๊ณ ๊ธฐ ์—…๋ฐ์ดํŠธ
					if(fish[2] == 0 ||
							fish[2] > visited[nx][ny] ||
							(fish[2] == visited[nx][ny] && (fish[0] > nx || (fish[0] == nx && fish[1] > ny)))) {
						fish[0] = nx;
						fish[1] = ny;
						fish[2] = visited[nx][ny];
					}
				}

				que.add(new int[]{nx, ny});
			}
		}
		return fish;
	}

	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		n = Integer.parseInt(in.readLine());
		map = new int[n][n];

		for(int i = 0; i < n; i++) {
			st = new StringTokenizer(in.readLine());
			for(int j = 0; j < n; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if(map[i][j] == 9) start = new int[]{i, j}; // ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜
			}
		}

		shark = 2;
		while(true) {
			Deque<int[]> que = new ArrayDeque<>();
			que.add(start);

			int[][] visited = new int[n][n];
			visited[start[0]][start[1]] = 1;
			map[start[0]][start[1]] = 0;

			int[] now = bfs(que, visited, new int[]{0, 0, 0});
			if(now[2] == 0) { // ๋”์ด์ƒ ๋จน์„ ๋ฌผ๊ณ ๊ธฐ ์—†์„ ๋•Œ
				System.out.println(ans);
				return;
			}

			ans += now[2]-1; // ๋ฌผ๊ณ ๊ธฐ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„ ๋ˆ„์ 
			cnt++; // ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ๊ฐœ์ˆ˜ ๋ˆ„์ 
			if(cnt == shark) {
				cnt = 0;
				shark++; // ์ƒ์–ด ํฌ๊ธฐ๋งŒํผ ๋ฌผ๊ณ ๊ธฐ ๋จน์œผ๋ฉด ์ƒ์–ด ํฌ๊ธฐ ํ‚ค์›Œ์ฃผ๊ธฐ
			}
			map[now[0]][now[1]] = 0; // ๋ฐฉ๊ธˆ ๋จนํžŒ ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜๋Š” ๋นˆ ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ
			start = Arrays.copyOf(now, 2); // ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜๋ฅผ ๋ฐฉ๊ธˆ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์œ„์น˜๋กœ ์˜ฎ๊ฒจ์ฃผ๊ธฐ
		}
	}
}

๐Ÿ‘‰ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ + BFS ๋ฌธ์ œ

์ƒ์–ด๊ฐ€ ํ•œ ๋ฒˆ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ๋งˆ๋‹ค, bfs ํƒ์ƒ‰์„ ํ†ตํ•ด ์ตœ์ ์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„

  • main ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ while ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ƒ์–ด๊ฐ€ ์ตœ์ ์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ํ‘œํ˜„ํ–ˆ๋‹ค.
    ํ•œ ๋ฒˆ์˜ while ์‹คํ–‰ == ์ƒ์–ด๊ฐ€ ํ•œ ๋ฒˆ ๋จน๋Š” ์ตœ์ ์˜ ๋ฌผ๊ณ ๊ธฐ ์ฐพ์•„ ๋จน๊ธฐ
  • start ๋ฐฐ์—ด์—๋Š” ์ƒ์–ด์˜ ์‹œ์ž‘์ ์ด ์ €์žฅ๋˜๋Š”๋ฐ, que์— start ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ 
    visited์™€ map์˜ start ์œ„์น˜๋ฅผ ์ ์ ˆํžˆ ์ดˆ๊ธฐํ™”์‹œํ‚จ ํ›„ bfs ํƒ์ƒ‰์„ ๋Œ๋ ค์ฃผ์—ˆ๋‹ค.
    (map์€ ์ด์ œ ์ƒ์–ด๊ฐ€ ๋จน์„ ๋ฌผ๊ณ ๊ธฐ ์œ„์น˜๋กœ ์ด๋™ํ•  ๊ฒƒ์ด๋ฏ€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ ,
    visitied๋Š” ์ƒ์–ด์˜ ์œ„์น˜๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ๊ฒƒ์ด๋ฏ€๋กœ 1๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.)
  • bfs ํƒ์ƒ‰์€ ํŠน๋ณ„ํ•œ ์ ์€ ์—†์œผ๋‚˜, ํ™•์ธํ•ด์•ผ ํ•  ์ ์€
    ์ƒ์–ด๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋งŒ๋‚ฌ๋‹ค๋ฉด, ๊ธฐ์กด์— ๋จน์œผ๋ ค๊ณ  ํ–ˆ๋˜ ๋ฌผ๊ณ ๊ธฐ๋ณด๋‹ค
    ๋” ์ ํ•ฉํ•œ์ง€(๋” ํฐ์ง€) ํ™•์ธ ํ›„, ๋จน์„ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„,,!!
  • ๊ทธ๋ฆฌ๊ณ  ์œ„์˜ ๊ฐฑ์‹ ์€ fish ๋ฐฐ์—ด์„ ํ†ตํ•ด ์ง„ํ–‰๋˜๋Š”๋ฐ, ์ด fish ๋ฐฐ์—ด์€ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์œผ๋กœ,
    bfs ํƒ์ƒ‰ ์ข…๋ฃŒ ์‹œ ์ด ๋ฐฐ์—ด์„ ํ†ตํ•ด ์–ด๋–ค ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„์ง€, ํ˜น์€ ๋จน์„ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์—ˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
  • bfs ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ ํ›„, bfs ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ fish ๋ฐฐ์—ด์€ now๋ผ๋Š” ๋ฐฐ์—ด์— ๋‹ด์•„์ฃผ์—ˆ๋Š”๋ฐ,
    now[2] ๊ฐ’์ด 0์ด๋ผ๋ฉด ๋จน์„ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์—ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ans๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋ฐ”๋กœ ๋ฆฌํ„ดํ–ˆ๋‹ค.
  • ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ans์— ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋ฐ์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์ธ now[2]-1์„ ๋”ํ•ด์ฃผ์—ˆ๊ณ ,
    cnt๋ฅผ ํ†ตํ•ด ๋จน์€ ๋ฌผ๊ณ ๊ธฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์† ๋ˆ„์ ํ•ด์ฃผ์—ˆ๋‹ค.
    cnt ๊ฐ’์ด ์ƒ์–ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™์•„์ง€๋ฉด cnt๋Š” ๋‹ค์‹œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”, ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 1 ๋Š˜๋ ธ๋‹ค.
  • ๋ฐฉ๊ธˆ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ์˜ map ์œ„์น˜๋Š” 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๊ณ ,
    start ๋ฐฐ์—ด์€ ๋ฐ”๋€ ์ƒ์–ด์˜ ์œ„์น˜๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋‹ค์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์‹œ์ž‘์ ์—์„œ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์ฃ ๊ธˆ ๋ณต์žกํ•œ,, ๋ฌธ์ œ์˜€์ง€๋งŒ!! ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํ•ดํ•˜๊ณ  ํ’€๋ฉด ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์—ˆ๋‹ค.

๋Œ“๊ธ€