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;
}
}
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 17779 ๊ฒ๋ฆฌ๋งจ๋๋ง2 - Java (0) | 2022.10.27 |
---|---|
[BOJ] 17140 ์ด์ฐจ์ ๋ฐฐ์ด๊ณผ ์ฐ์ฐ - Java (0) | 2022.10.27 |
[BOJ] 17143 ๋์์ - Java (0) | 2022.10.23 |
[BOJ] 14891 ํฑ๋๋ฐํด - JAVA (1) | 2022.09.25 |
[BOJ] 15683 ๊ฐ์ (Java) (0) | 2022.09.15 |