D4
๋ชจ๋ ๋ฌผ ์ ์์๋ถํฐ ๋ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๊ฐ ๋ ์ ์์ ๋ฌผ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง์ฃ .
๊ฐ ๋ ์ ์์๋ถํฐ ๋ฌผ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ฉด ๋ชจ๋ ๋ ์ ์ ๋ํด ๋ชจ๋ BFS๋ฅผ ์ฒ๋ฆฌํด์ค์ผํ๋ ๋ฐ๋ฉด์, ๋ชจ๋ ๋ฌผ์ ์์๋ถํฐ์ ๋ ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ฉด ๋ฌผ ์ ๋ค ๊ฐ์๋งํผ๋ง BFS๋ฅผ ํ๊ณ , ์ด๋ฏธ ๋ฐฉ๋ฌธ๋ ๋ ์ ์ ๊ฐ์ง์น๊ธฐ ๋ ์ ์์ด์ ๋ ํจ์จ์ ์ด์ฃ .
๋ฌด์กฐ๊ฑด ๋น ์ ์ธ (0, 0)๋ถํฐ ๋งค์๊ฐ BFS๋ฅผ ํ๋ฉด ๊ฐ์ฅ์๋ฆฌ์ธ ์น์ฆ๋ฅผ ์ฐพ์ ์ ์๋ค.
์น์ฆ๋ฅผ ๋ง๋๋ฉด ํ์์ ๋ฉ์ถ๊ณ , ๋น ์นธ์ ๋ง๋๋ฉด ํ์์ ๊ณ์ํด์ ๋น์ ๊ณผ ์ธ์ ํด ์๋ (์ฆ ๊ฐ์ฅ์๋ฆฌ์ธ) ์น์ฆ๋ฅผ ๋ น์ผ ์ ์๋ค.
static int bfs() {
ArrayDeque<int[]> queue = new ArrayDeque<>();
queue.add(new int[]{0, 0});
int[][] visited = new int[N][M];
visited[0][0] = 1;
int melted = 0;
while (!queue.isEmpty()) {
int[] node = queue.pollFirst();
int y =node[0];
int x = node[1];
for (int d = 0; d < 4; d++) {
int ny = y + DY[d];
int nx = x + DX[d];
if (isValidCoordinate(ny, nx) && visited[ny][nx] == 0) {
visited[ny][nx] =1;
if (grid[ny][nx] == 1) {
grid[ny][nx] =0;
melted ++;
} else {
queue.add(new int[]{ny, nx});
}
}
}
}
cheeseCount -= melted;
return melted;
}
๋งค๋ฒ BFS๋ฅผ ํ๊ธฐ ์ ์ ๋จ์์๋ ์น์ฆ์ ์๋ฅผ ๋ณ์์ ์ ์ฅํด ๋ง์ง๋ง์ ์ถ๋ ฅํ๋ค.
int time = 0;
while (cheeseCount > 0) {
lastCheeseCount = cheeseCount;
bfs();
time++;
}
๊ตฌ๋ฉ์ ์กฐ๊ฑด์ ์ถฉ์กฑ์ํค๋ ์ ์ ํน์ง์ ๊ณ ๋ฏผํ๋ค๊ฐ ์๊ฐ์ ํ๋นํ๋ค.
ํ์ ์ค ์น๊ตฌ ๊ด๊ณ๋ฅผ ๋งบ์ ์ ์์ผ๋ฉด ๋ชจ๋ ๋งบ์ ๋ค์, ์น๊ตฌ ๋ฌด๋ฆฌ ๋ณ๋ก ๊ฐ์ฅ ์น๊ตฌ๋น๊ฐ ์ ๋ ดํ ๊ฒ์ ๋น์ฉ์ ํฌํจ์ํจ๋ค.
Kruskal ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
makeSet();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int f1 = Integer.parseInt(st.nextToken());
int f2 = Integer.parseInt(st.nextToken());
union(f1, f2);
}
์น๊ตฌ ๋ฌด๋ฆฌ๋ฅผ ์์ฑํ๊ณ ๋์ ๋ฃจํธ ๋ํ์๋ฅผ ๊ฐ๊ณ ์๋๋ก ๋ชจ๋ ์ ๋ฐ์ดํธ์์ผ์ค๋ค.
long minCost = 0;
Map<Integer, Long> componentMinCost = new HashMap<>();
for (int i = 1; i <= N; i++) {
int root = findSet(i);
componentMinCost.put(root, Math.min(componentMinCost.getOrDefault(root, Long.MAX_VALUE), friendFees[i]));
}
for (long cost : componentMinCost.values()) {
minCost += cost;
}
์น๊ตฌ ๋ฌด๋ฆฌ ๋ณ๋ก ๊ฐ์ฅ ๊ฐ๊ฒฉ์ด ๋ฎ์ ์น๊ตฌ๋น๋ฅผ ํฌํจ์ํจ๋ค.
์ ค๋ค์ ์ ์ค
์ ค๋ค
๋งํฌ
์์งํ ์ ค๋ค์ ์ ์ค ํ๋ ์ด ์ฒ์ํ๋ ์ฌ๋์ ๋งํฌ๊ฐ ์ ค๋ค์ธ์ค ์ ์ ์์ ๊ฒ ๊ฐ์
ํ์ฌํผ ์์ํ ๋งํฌ๋ ๊ทธ๋ฆฌ๋ ๋๊ตด ์ ์ฅ~
๊ทธ๋ํ ์์์ ๋
ธ๋ ๊ฐ ์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ, (0,0)๋ถํฐ (N-1, N-1)๊น์ง
ํ์ ๋น์ฉ์ ์ต์ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค
๋ค์ต์คํธ๋ผ ์ ํ ์ด์
boolean[][] visited = new boolean[N][N];
int[][] minCost = new int[N][N];
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> Integer.compare(a[2], b[2]));
ํ์ํ ์ขํ์ธ์ง ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ด์ 2D ๋ฐฐ์ด visited
๋ฅผ ์ด๊ธฐํํ๋ค
(y, x)
์ขํ๊น์ง์ ์ต์ ๋น์ฉ์ ๋ด์ 2D ๋ฐฐ์ด minCost
๋ฅผ ์ด๊ธฐํํ๋ค.
minCost
๋ ์ฌ๋ ์ต์๊ฐ ๊ตฌํ๊ธฐ ๋ฌธ์ ํ์ด์ ๊ฐ์ด ๋ชจ๋ ์
๊ฐ์ Integer.MAX_VALUE
๋ก ์ด๊ธฐํํด์ผ ํ๋ค
for (int i = 0; i < N; i++) {
Arrays.fill(minCost[i], INF);
}
์์์ ๋ํ ๋น์ฉ์ด ๋ ๋ค.
minCost[startY][startX] = grid[startY][startX];
๋งค๋ฒ ์ต์๋น์ฉ๋ถํฐ ๊บผ๋ด์ ํ์ํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ์ต์๋น์ฉ ์์ ์์ผ๋ก ์ ๋ ฌํ PriorityQueue
๋ฅผ ์ด๊ธฐํํ๋ค.
int[] a = {y์ขํ, x์ขํ, ๋น์ฉ}
์์์ ์ ์ฐ์ ์์ํ์ ์ถ๊ฐํ ๋ค์ ํ์์ ์์ํ๋ค.
pq.offer(new int[] {startY, startX, minCost[startY][startX]});
while (!pq.isEmpty()) {
int[] node = pq.poll(); // ์ฐ์ ์์ํ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์์ ๋
ธ๋๋ถํฐ ๊บผ๋ธ๋ค
int y = node[0];
int x = node[1];
int cost = node[2];
if (visited[y][x]) continue; // ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฉด ํต๊ณผํ๋ค
visited[y][x] = true; // ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ฉด ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ถํฐ ํ๋ค
if (y == endY && x == endX) return cost; // ๋ชฉ์ ์ง์ ๋์ฐฉํ์ผ๋ฉด ๋ฆฌํดํ๋ค
for (int d = 0; d < 4; d++) {
int ny = y + DY[d];
int nx = x + DX[d];
// ์ ํจํ, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ขํ && ์ต์ ๋น์ฉ์ด ํ์ฌ ๋น์ฉ๋ณด๋ค ํฌ๋ฉด
if (isValidCoordinate(ny, nx) && !visited[ny][nx] && minCost[ny][nx] > cost + grid[ny][nx]) {
// ์ต์ ๋น์ฉ์ ์
๋ฐ์ดํธํ๊ณ ,
minCost[ny][nx] = cost + grid[ny][nx];
// ํ์ ์ถ๊ฐํด์ ์ถํ ๋ฐฉ๋ฌธํ๋ค
pq.offer(new int[] {ny, nx, minCost[ny][nx]});
}
}
return -1;
}
๊ณจ๋3
(0,0)
๋ถํฐ (H-1, W-1)
์ผ๋ก ์ด๋ํ๋คint[][] HDY = {-1, -2, -2, -1, 1, 2, 2, 1}
int[][] HDX = {-2, -1, 1, 2, -2, -1, 1, 2}
์ด๋ ๋ฐฉ์์ด ๋ค์ํ์ง๋ง ๊ฒฐ๊ตญ ์ด๋์ ๋น์ฉ, ์ฆ ๊ฐ์ค์น๋ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ BFS์ ๋ณํ์ด๋ผ๊ณ ํ๋จํ๋ค
BFS ๋ด์์ ์ฌ๋ฐฉ ํ์๊ณผ ๋ง ํ์ ๋ชจ๋๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.
๋ง ์ด๋์ ์ด K๋ฒ๋ง ํ์ฉ ๋๊ธฐ ๋๋ฌธ์ ํ์ฌ ๋ ธ๋๊ฐ ๋ง ์ด๋์ K๋ฒ ๊ฑฐ์ณค๋ค๋ฉด ๋ง ํ์์ ์ํํ์ง ์๋๋ค.
์ ์กฐ๊ฑด์ ํต๊ณผํ๋ค๋ฉด ๋ง ์ด๋ (ํ๋ฐฉํ์)์ ์ํํ๋ค. visited
๋ฐฐ์ด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ด๊ฑด์ธ๋ฐ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ขํ๋๋ผ๋ ๋ง ์ด๋์ ๋ช๋ฒ ํ๋์ง์ ๋ฐ๋ผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์๋ค.
์ฆ, ๋ง ์ด๋ ์์ด ํ ์ขํ์ ๋์ฐฉํ ๊ฒฝ์ฐ์ ๋ง ์ด๋ 1๋ฒ์ผ๋ก ๋์ฐฉํ ๊ฒฝ์ฐ์, ๋ง ์ด๋ 2๋ฒ์ผ๋ก ๋์ฐฉ ํ ๊ฒฝ์ฐ ๋ชจ๋ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ง ์ด๋ ํ์์ ๋ฐ๋ผ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ์ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํด์ผ ํ๋ค.
int visited[][][] = new int[H][W][K+1];
๋ฐฉ๋ฌธ ๋ฐฐ์ด์ 3์ฐจ ์ ์ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํด์ visited[y][x][i]
๋ง ์ด๋ i
๋ฒ์ผ๋ก ๋์ฐฉํ ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค.
static int bfs(int startY, int startX, int endY, int endX) {
ArrayDeque<int[]> queue = new ArrayDeque<>();
int[][][] visited = new int[H][W][K+1];
queue.add(new int[]{startY, startX, 0});
visited[startY][startX][0] = 1;
while (!queue.isEmpty()) {
int[] node = queue.pollFirst();
int y = node[0];
int x = node[1];
int horse = node[2];
if (y == endY && x == endX) return visited[y][x][horse] -1;
for (int d = 0; d < 4; d++) {
int ny = y + DY[d];
int nx = x + DX[d];
if (isVisitable(ny, nx) && visited[ny][nx][horse] == 0) {
visited[ny][nx][horse] = visited[y][x][horse] + 1;
queue.add(new int[]{ny, nx, horse});
}
}
if (horse < K) {
for (int d = 0; d < 8; d++) {
int ny = y + HDY[d];
int nx = x + HDX[d];
if (isVisitable(ny, nx) && visited[ny][nx][horse+1] == 0) {
visited[ny][nx][horse + 1] = visited[y][x][horse] + 1;
queue.add(new int[] {ny, nx, horse + 1});
}
}
}
}
return -1;
}
๋ง์ด ๋๊ณ ํ ์์ญ์ด ํ์ด ์ฝ๋
BFS ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ฉด ๋ฒฝ์ 1๋ฒ ๋ถ์ ์ ์๋๋ฐ ์ต๋จ๊ฑฐ๋ฆฌ, ๋ง ์ด๋ K๋ฒ ํ ์ ์๋๋ฐ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฑ, ์กฐ๊ฑด์ด ๋ค์ด๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ ๋ณํ ๋ฌธ์ ๋ค์ด ์๋ค.
์ด๋ด ๋, ์กฐ๊ฑด์ ํ์ ์ ํ K์ ๋ํ์ฌ visited[H][W][K+1]
๋ก ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ต๊ดํํ์.
์ ์ฑ์ค๋ฌ์ด ํฌ์คํ ์๋ณด๊ณ ๊ฐ์ฉ!
์ด์ ๋ ์จ๊ฐ ๋ง์ด ํ๋ ธ๋๋ฐ ๋ฐ๋ปํ ๋ดํ์ด์ ๋ง์ผ์๋ฉด์ ์ค๋๋ ๋ด์ผ๋ ๋งค์ผ๋งค์ผ ํ๋ณตํ ํ๋ฃจ๋ฅผ ๋ณด๋ด์๊ธธ ๋ฐ๋์ฉ!
๊ฐ๋์ฉ ์๊ฐ ๋์๋ฉด ์ ๋ธ๋ก๊ทธ๋ ํ๋ฒ์ฉ ๋ค๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค ^^ โฅ
์์ฃผ ๋๋ฌ์ฌ๊ป์ง!