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

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

category Algorithm/BOJ 2022. 10. 23. 13:55

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

 

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

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

www.acmicpc.net


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

1. NxNํฌ๊ธฐ์˜ map์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. map์—์„œ 0์€ ๋นˆ ์นธ, 1~6์€ ๋ฌผ๊ณ ๊ธฐ ํฌ๊ธฐ, 9๋Š” ์•„๊ธฐ์ƒ์–ด์˜ ์œ„์น˜์ด๋‹ค.

2. ์•„๊ธฐ์ƒ์–ด์˜ ์ดˆ๊ธฐ ํฌ๊ธฐ๋Š” 2์ด๋ฉฐ, 1์ดˆ์— 1์นธ ์”ฉ ์ด๋™ํ•œ๋‹ค.

3. ์•„๊ธฐ์ƒ์–ด๋Š” ์ž๊ธฐ๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค.

                                    ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ

                                    ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฌผ๊ณ ๊ธฐ๋Š” ์ง€๋‚˜๊ฐˆ ์ˆ˜๋„ ์—†๋‹ค. (๋ฒฝ์ด๋ผ๊ณ  ์ƒ๊ฐ)

4. ์•„๊ธฐ์ƒ์–ด๋Š” ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ 1๋งˆ๋ฆฌ๋ฅผ ํ–ฅํ•ด ์ด๋™ํ•œ๋‹ค. 

 - ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์ผ ๊ฒฝ์šฐ, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

 - ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ ๋˜ํ•œ ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์ผ ๊ฒฝ์šฐ, y๊ฐ€ ๋” ์ž‘์€ ๋…€์„, ๊ฐ™์„ ๊ฒฝ์šฐ x๊ฐ€ ๋” ์ž‘์€ ๋…€์„์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

 - ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ๋ž€, ์ง€๋‚˜์•ผํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ์†Ÿ๊ฐ’์ผ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (bfs) (๋งจํ•˜ํƒ„ ์•„๋‹˜)

5. ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด ์•„๊ธฐ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 1 ์ฆ๊ฐ€ํ•œ๋‹ค.

 

* ๋ฌผ๊ณ ๊ธฐ๋Š” ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

* ๋” ์ด์ƒ ์žก์•„๋จน์„ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์œผ๋ฉด ์ข…๋ฃŒํ•˜๋ฉฐ, ๋ช‡ ์ดˆ ๋™์•ˆ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 

 

2. ํ’€์ด

bfs + ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ์ด๋‹ค.

๋‚š์‹œ์™•, ๋ฏธ์ƒ๋ฌผ๊ฒฉ๋ฆฌ์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์ด๋‹ค. ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด

map์— Fish๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ,

PriorityQueue ์ •๋ ฌ ๊ธฐ์ค€์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋Š” ๊ฒƒ,

bfs๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์šฐ์„ ์€ Fish ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด y,x(์ขŒํ‘œ), dist(๊ฑฐ๋ฆฌ), size(ํฌ๊ธฐ)๋ฅผ ์ €์žฅํ•˜์˜€๋‹ค.

๊ทธ๋ฆฌ๊ณ  pq๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ ฌํ•ด์คฌ๋‹ค. ์ •๋ ฌ ๊ธฐ์ค€์€ ๊ฑฐ๋ฆฌ - y - x (์˜ค๋ฆ„์ฐจ์ˆœ)์œผ๋กœ ์ •๋ ฌํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ pq๋Š” ํ›„๋ณด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํ์ด๋‹ค. ๋ชฉํ‘œ ๋ฌผ๊ณ ๊ธฐ๋Š” pq์˜ ๋งจ ์•ž ๋…€์„์ด ๋œ๋‹ค.

 

1. ๋ฌดํ•œ ๋ฐ˜๋ณต์„ ๋Œ๋ฉด์„œ

2. PriorityQueue๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.

3. ๋ชฉํ‘œ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ๋Š”๋‹ค. => bfs ๋Œ๋ฉด์„œ pq์— ํ›„๋ณด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

4. ์•„๊ธฐ์ƒ์–ด๊ฐ€ ์ด๋™ํ•œ๋‹ค.

  - ๋ชฉํ‘œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์œผ๋ฉด (pq๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด) ์ข…๋ฃŒํ•œ๋‹ค.

  - ๋ชฉํ‘œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด (pq๊ฐ€ ์ฐจ์žˆ๋‹ค๋ฉด) ํ•ด๋‹น ์ขŒํ‘œ๋กœ ์ด๋™ํ•œ๋‹ค.

      => ์ด์ „ ์•„๊ธฐ์ƒ์–ด ์œ„์น˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”, ์ƒˆ๋กœ์šด ์œ„์น˜์— 9๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.(์ด๊ฑด ์•ˆํ•ด์ค˜๋„ ๋จ)

      => ๋ชฉํ‘œ ๋ฌผ๊ณ ๊ธฐ ์ขŒํ‘œ๋กœ ์ด๋™ํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ์žก์•„ ๋จน์€ ๊ฒƒ์ด๋ฏ€๋กœ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ์ˆ˜+1์„ ํ•ด์ค€๋‹ค. 

      => ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๊ฐ€ ์•„๊ธฐ์ƒ์–ด์˜ ํฌ๊ธฐ์™€ ๋™์ผํ•˜๋ฉด ๋จน์€ ๋ฌผ๊ณ ๊ธฐ์ˆ˜ 0 ์ดˆ๊ธฐํ™”, ์•„๊ธฐ์ƒ์–ด ํฌ๊ธฐ+1์„ ํ•ด์ค€๋‹ค. 

      => dist๋งŒํผ ์ดˆ๊ฐ€ ์ง€๋‚œ ๊ฒƒ์ด๋ฏ€๋กœ(1์ดˆ์— 1์นธ) ์ดˆ์— dist๋ฅผ ๋”ํ•ด์ค€๋‹ค.

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€

1. ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๊ฐ€ ์•„๊ธฐ์ƒ์–ด ํฌ๊ธฐ์™€ ๋™์ผํ•  ๋•Œ, ์•„๊ธฐ์ƒ์–ด ํฌ๊ธฐ+1๋งŒ ํ•ด์ฃผ๊ณ , ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์ง€ ์•Š์•„์„œ ๋‹ต์ด ์กฐ๊ธˆ์”ฉ ๋” ํฌ๊ฒŒ ๋‚˜์™”์—ˆ๋‹ค.

 

3. ์ฝ”๋“œ

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

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

public class BOJ_16236_์•„๊ธฐ์ƒ์–ด {

	static PriorityQueue<Fish> pq;
	static int[][] map;
	static int N, M, sec, cnt, nowDist;
	static Fish shark;
	
	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;
		N= Integer.parseInt(br.readLine());
		map = new int[N][N];
		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());
				if (map[i][j] == 9) {
					shark = new Fish(i, j, 0, 2);
				}
			}
		} //์ž…๋ ฅ ๋
		
		sec=0;
		solution();
		System.out.println(sec);
	}
	
	static void solution() {
		while(true) {
			pq = new PriorityQueue<> (); //pq ์ดˆ๊ธฐํ™”
			//1. ๋ชฉํ‘œ๋ฌผ๊ณ ๊ธฐ ์ฐพ๊ธฐ
			bfs();
			
			//2. ์ƒ์–ด ์ด๋™
			//์ด๋™ํ•  ๊ณณ์ด ์—†์œผ๋ฉด ์ข…๋ฃŒ(์—„๋งˆ์ƒ์–ด์—๊ฒŒ ๋„์›€ ์š”์ฒญ)
			if (pq.isEmpty()) break;
			//๋ชฉํ‘œ ๋ฌผ๊ณ ๊ธฐ ์ขŒํ‘œ๋กœ ์ด๋™
			Fish cur = pq.poll();
			map[shark.y][shark.x] = 0;
			shark.y=cur.y;
			shark.x=cur.x;
			map[shark.y][shark.x] = 9;
			cnt++; //๋จน์Œ
			sec += cur.dist; //๊ฑฐ๋ฆฌ๋งŒํผ ์ดˆ๊ฐ€ ์ง€๋‚จ
			if (cnt == shark.size) {
				cnt=0;
				shark.size++;
			}
		}
	}
	
	//์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋ฉด pq์— ๋„ฃ์–ด์คŒ
	static void bfs() {
		Queue<Fish> queue = new ArrayDeque<> ();
		boolean[][] visited = new boolean[N][N];
		nowDist= Integer.MAX_VALUE;
		
		queue.offer(new Fish(shark.y, shark.x, 0));
		visited[shark.y][shark.x] = true;
		while (!queue.isEmpty()) {
			Fish cur = queue.poll();
			for (int d=0; d<4; d++) {
				int ny= cur.y+dy[d];
				int nx= cur.x+dx[d];
				if (ny<0 || ny>=N || nx<0 || nx>=N || visited[ny][nx] || map[ny][nx] > shark.size) continue;
				//ํฌ๊ธฐ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋“ค๋งŒ ๋‚จ์Œ
				queue.offer(new Fish(ny, nx, cur.dist+1));
				visited[ny][nx] = true;
				
				if (map[ny][nx] != 0 && map[ny][nx] < shark.size) {
					if (cur.dist+1 > nowDist) return; //ํ˜„์žฌ ์ตœ๋Œ€๊ฑฐ๋ฆฌ๋ณด๋‹ค ํฌ๋ฉด pq์— ๋” ์•ˆ๋„ฃ์–ด์ค˜๋„ ๋œ๋‹ค
					pq.offer(new Fish(ny, nx, cur.dist+1));
					nowDist = cur.dist+1;
				}
			}
		}
	}
	
	static class Fish implements Comparable<Fish>{
		int y, x, dist, size;
		Fish(int y, int x, int dist, int size) {
			this.y = y;
			this.x = x;
			this.dist = dist; //๊ฑฐ๋ฆฌ
			this.size = size;
		}
		Fish(int y, int x, int dist) {
			this.y = y;
			this.x = x;
			this.dist = dist; //๊ฑฐ๋ฆฌ
		}
		@Override
		public int compareTo(Fish o) { //๊ฑฐ๋ฆฌ์ˆœ - y์ˆœ - x์ˆœ ์˜ค๋ฆ„์ฐจ์ˆœ
			if (this.dist == o.dist) {
				if (this.y == o.y) {
					return this.x-o.x;
				} else return this.y-o.y;
			} else return this.dist-o.dist;
		}
	}
}