[Algorithm] ๐Ÿฆˆ๋ฐฑ์ค€ 16236 ์•„๊ธฐ ์ƒ์–ด

HaJingJingยท2021๋…„ 6์›” 17์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
74/119

0. ๋ฌธ์ œ

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

์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํฌ๊ธฐ๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ , ์•„๊ธฐ ์ƒ์–ด๋Š” 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋จน์„ ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

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

๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ช‡ ์ดˆ ๋™์•ˆ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ๊ณต๊ฐ„์˜ ํฌ๊ธฐ N(2 โ‰ค N โ‰ค 20)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ณต๊ฐ„์˜ ์ƒํƒœ๋Š” 0, 1, 2, 3, 4, 5, 6, 9๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

0: ๋นˆ ์นธ
1, 2, 3, 4, 5, 6: ์นธ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ํฌ๊ธฐ
9: ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜
์•„๊ธฐ ์ƒ์–ด๋Š” ๊ณต๊ฐ„์— ํ•œ ๋งˆ๋ฆฌ ์žˆ๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก bfs๋ฅผ ํ†ตํ•ด ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์Œ
๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ
๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ณณ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ
์ƒ์–ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ณณ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ธฐ
์ƒ์–ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ณณ์€ ๊ทธ๋ƒฅ ์ด๋™ํ•˜๊ธฐ
์ƒ์–ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ์žก์•„๋จน๊ณ  ์ด๋™ํ•˜๊ธฐ

๐Ÿ’ก BFS๋ฅผ ํ†ตํ•ด ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์œผ๋ฉด ๊ทธ ์œ„์น˜์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๊ณ , ๊ทธ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ , time์„ ๋Š˜๋ ค์คŒ (์ด๋ฅผ ์žก์•„๋จน์„ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•จ)

๐Ÿ’ก ๋งŒ์ผ ์ƒ์–ด์˜ ํฌ๊ธฐ ๋งŒํผ ๋จน์—ˆ๋‹ค๋ฉด ์ƒ์–ด์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์คŒ

2. ํ•ต์‹ฌ ํ’€์ด

  1. BFS๋ฅผ ์ด์šฉํ•ด ๊ฑฐ๋ฆฌ ๊ตฌํ•ด dist์— ์ €์žฅํ•จ
static void bfs(int a, int b) {
	Queue<Node> q = new LinkedList<>();
		
	q.add(new Node(a,b));
		
	while(!q.isEmpty()) {			
		Node cur = q.poll();
		int x = cur.x;
		int y = cur.y;
			
		for(int i=0; i<4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
				
				...

			dist[nx][ny] = dist[x][y]+1;
				
				...

			q.add(new Node(nx,ny));
		}
	}
}
  1. ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ || ์ƒ์–ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ณณ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ธฐ
if(dist[nx][ny] != 0 || map[nx][ny] > babyShark)
	continue;
  1. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ณณ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ
if(nx < 0 || ny < 0 || nx >= n || ny >= n)
	continue;
  1. ์ƒ์–ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ณณ์€ ๊ทธ๋ƒฅ ์ด๋™ํ•˜๊ธฐ
dist[nx][ny] = dist[x][y] + 1;
...
q.add(new Node(nx, ny));
  1. ์ƒ์–ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ์žก์•„๋จน๊ณ  ์ด๋™ํ•˜๊ธฐ

๋–จ์–ด์ ธ ์žˆ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋™์ผํ•˜๋‹ค๋ฉด, 1)์œ„์ชฝ ๋จผ์ €(x๊ฐ€ ์ž‘์€์ชฝ), ๋™์ผํ•œ ๋†’์ด์— ์žˆ๋‹ค๋ฉด ์™ผ์ชฝ(y๊ฐ€ ์ž‘์€์ชฝ)๋จผ์ € ์žก์•„๋จน๊ธฐ

if(map[nx][ny] != 0 && map[nx][ny] < babyShark) {
	if(minDist > dist[nx][ny]) {
		minDist = dist[nx][ny];
		minX = nx;
		minY = ny;
	} else if(minDist == dist[nx][ny]) {
		if(minX == nx) {
			if(minY > ny) {
				minX = nx;
				minY = ny;
			}
		} else if(minX > nx) {
			minX = nx;
			minY = ny;
		}
	}
					
}
  1. BFS๋ฅผ ํ†ตํ•ด ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์œผ๋ฉด ๊ทธ ์œ„์น˜์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๊ณ , ๊ทธ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ , time์„ ๋Š˜๋ ค์คŒ (์ด๋ฅผ ์žก์•„๋จน์„ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•จ)
while(true) {
	dist = new int[n][n];
	minX = Integer.MAX_VALUE;
	minY = Integer.MAX_VALUE;
	minDist = Integer.MAX_VALUE;
			
	bfs(x,y);
			
	if(minX != Integer.MAX_VALUE && minY != Integer.MAX_VALUE) { // ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด
		eatCount++;  //๋จน์€ ํšŸ์ˆ˜ ๋Š˜๋ ค์คŒ
		x = minX;
		y = minY;
		map[x][y] = 0; // ์œ„์น˜๋กœ ์ด๋™
		time += dist[x][y]; // ๋–จ์–ด์ ธ ์žˆ๋Š” ๊ฑฐ๋ฆฌ๋Š” ๊ณง ์‹œ๊ฐ„
				
		...

	} else
		break;
}
  1. ๋งŒ์ผ ์ƒ์–ด์˜ ํฌ๊ธฐ ๋งŒํผ ๋จน์—ˆ๋‹ค๋ฉด ์ƒ์–ด์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์คŒ
if(eatCount == babyShark) {
	babyShark++;
	eatCount = 0;
} 

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.LinkedList;

public class Bruteforce_11 {
	static int[][] map;
	static int[][] dist;
	static int[] dx = {0,-1,1,0};
	static int[] dy = {-1,0,0,1};
	static int n, minX, minY, minDist, babyShark = 2, eatCount = 0, time = 0;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		map = new int[n][n];
		
		int x=0, y=0;
		
		for(int i=0; i<n; i++) {
			String[] s = br.readLine().split(" ");
			for(int j=0; j<n; j++) {
				map[i][j] = Integer.parseInt(s[j]);
				
				if(map[i][j] == 9) {
					x = i;
					y = j;
					map[x][y] = 0;
				}
			}
		}
		
		while(true) {
			dist = new int[n][n];
			minX = Integer.MAX_VALUE;
			minY = Integer.MAX_VALUE;
			minDist = Integer.MAX_VALUE;
			
			bfs(x,y);
			
			if(minX != Integer.MAX_VALUE && minY != Integer.MAX_VALUE) {
				eatCount++;
				x = minX;
				y = minY;
				map[x][y] = 0;
				time += dist[x][y];
				
				if(eatCount == babyShark) {
					babyShark++;
					eatCount = 0;
				} 
			} else
				break;
		}
		
		System.out.println(time);
	}
	
	static void bfs(int a, int b) {
		Queue<Node> q = new LinkedList<>();
		
		q.add(new Node(a,b));
		
		while(!q.isEmpty()) {			
			Node cur = q.poll();
			int x = cur.x;
			int y = cur.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)
					continue;
				
				if(dist[nx][ny] != 0 || map[nx][ny] > babyShark)
					continue;

				dist[nx][ny] = dist[x][y]+1;
				
				if(map[nx][ny] != 0 && map[nx][ny] < babyShark) {
					if(minDist > dist[nx][ny]) {
						minDist = dist[nx][ny];
						minX = nx;
						minY = ny;
					} else if(minDist == dist[nx][ny]) {
						if(minX == nx) {
							if(minY > ny) {
								minX = nx;
								minY = ny;
							}
						} else if(minX > nx) {
							minX = nx;
							minY = ny;
						}
					}
					
				}
				q.add(new Node(nx,ny));
			}
		}
	}
	
	static class Node{
		int x;
		int y;
		Node(int x, int y){
			this.x = x;
			this.y = y;
		}
	}

}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€