์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ์์ด
- ํธ๋ผ์ด
- ๋ค์ต์คํธ๋ผ
- ํ์๊ฐ์
- Floyd
- Union Find
- dfs
- ๊ตฌํ
- ์กฐํฉ
- Django
- ๋นํธ๋ง์คํน
- BFS
- ์ฌ๊ท
- ์นด์นด์ค
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- ์ด์งํธ๋ฆฌ
- Dijkstra
- ์ด๋ถํ์
- ๊ทธ๋ฆฌ๋
- PriorityQueue
- ์ฐ์ ์์ํ
- ํ๋ก์ด๋์์
- LowerBound
- dp
- ์๋ฃ๊ตฌ์กฐ
- ๋ฐฑํธ๋ํน
- ์๋ฎฌ๋ ์ด์
- upperbound
- ๋ถ๋ถ์งํฉ
- ํฌํฌ์ธํฐ
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 19237 ์ด๋ฅธ ์์ด ๋ณธ๋ฌธ
[JAVA] BOJ ๋ฐฑ์ค 19237 ์ด๋ฅธ ์์ด
snowball๐ฐ 2023. 3. 6. 12:47https://www.acmicpc.net/problem/19237
19237๋ฒ: ์ด๋ฅธ ์์ด
์ฒซ ์ค์๋ N, M, k๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000) ๊ทธ ๋ค์ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฒฉ์์ ๋ชจ์ต์ด ์ฃผ์ด์ง๋ค. 0์ ๋น์นธ์ด๊ณ , 0์ด ์๋ ์ x๋ x๋ฒ ์์ด๊ฐ ๋ค์ด์๋ ์นธ์ ์๋ฏธ
www.acmicpc.net
๋ฌธ์
์ฒญ์๋ ์์ด๋ ๋์ฑ ์๋ผ ์ด๋ฅธ ์์ด๊ฐ ๋์๋ค. ์์ด๊ฐ ์ฌ๋ ๊ณต๊ฐ์ ๋ ์ด์ ๋ฌผ๊ณ ๊ธฐ๋ ์ค์ง ์๊ณ ๋ค๋ฅธ ์์ด๋ค๋ง์ด ๋จ์์๋ค. ์์ด์๋ 1 ์ด์ M ์ดํ์ ์์ฐ์ ๋ฒํธ๊ฐ ๋ถ์ด ์๊ณ , ๋ชจ๋ ๋ฒํธ๋ ์๋ก ๋ค๋ฅด๋ค. ์์ด๋ค์ ์์ญ์ ์ฌ์ํ๊ธฐ ์ํด ๋ค๋ฅธ ์์ด๋ค์ ์ซ์๋ด๋ ค๊ณ ํ๋๋ฐ, 1์ ๋ฒํธ๋ฅผ ๊ฐ์ง ์ด๋ฅธ ์์ด๋ ๊ฐ์ฅ ๊ฐ๋ ฅํด์ ๋๋จธ์ง ๋ชจ๋๋ฅผ ์ซ์๋ผ ์ ์๋ค.
N×N ํฌ๊ธฐ์ ๊ฒฉ์ ์ค M๊ฐ์ ์นธ์ ์์ด๊ฐ ํ ๋ง๋ฆฌ์ฉ ๋ค์ด ์๋ค. ๋งจ ์ฒ์์๋ ๋ชจ๋ ์์ด๊ฐ ์์ ์ ์์น์ ์์ ์ ๋์๋ฅผ ๋ฟ๋ฆฐ๋ค. ๊ทธ ํ 1์ด๋ง๋ค ๋ชจ๋ ์์ด๊ฐ ๋์์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ ์ค ํ๋๋ก ์ด๋ํ๊ณ , ์์ ์ ๋์๋ฅผ ๊ทธ ์นธ์ ๋ฟ๋ฆฐ๋ค. ๋์๋ ์์ด๊ฐ k๋ฒ ์ด๋ํ๊ณ ๋๋ฉด ์ฌ๋ผ์ง๋ค.
๊ฐ ์์ด๊ฐ ์ด๋ ๋ฐฉํฅ์ ๊ฒฐ์ ํ ๋๋, ๋จผ์ ์ธ์ ํ ์นธ ์ค ์๋ฌด ๋์๊ฐ ์๋ ์นธ์ ๋ฐฉํฅ์ผ๋ก ์ก๋๋ค. ๊ทธ๋ฐ ์นธ์ด ์์ผ๋ฉด ์์ ์ ๋์๊ฐ ์๋ ์นธ์ ๋ฐฉํฅ์ผ๋ก ์ก๋๋ค. ์ด๋ ๊ฐ๋ฅํ ์นธ์ด ์ฌ๋ฌ ๊ฐ์ผ ์ ์๋๋ฐ, ๊ทธ ๊ฒฝ์ฐ์๋ ํน์ ํ ์ฐ์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค. ์ฐ์ ์์๋ ์์ด๋ง๋ค ๋ค๋ฅผ ์ ์๊ณ , ๊ฐ์ ์์ด๋ผ๋ ํ์ฌ ์์ด๊ฐ ๋ณด๊ณ ์๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ ๋ค๋ฅผ ์ ์๋ค. ์์ด๊ฐ ๋งจ ์ฒ์์ ๋ณด๊ณ ์๋ ๋ฐฉํฅ์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๊ณ , ๊ทธ ํ์๋ ๋ฐฉ๊ธ ์ด๋ํ ๋ฐฉํฅ์ด ๋ณด๊ณ ์๋ ๋ฐฉํฅ์ด ๋๋ค.
๋ชจ๋ ์์ด๊ฐ ์ด๋ํ ํ ํ ์นธ์ ์ฌ๋ฌ ๋ง๋ฆฌ์ ์์ด๊ฐ ๋จ์ ์์ผ๋ฉด, ๊ฐ์ฅ ์์ ๋ฒํธ๋ฅผ ๊ฐ์ง ์์ด๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ๊ฒฉ์ ๋ฐ์ผ๋ก ์ซ๊ฒจ๋๋ค.

<๊ทธ๋ฆผ 1>

<๊ทธ๋ฆผ 1>์ ๋งจ ์ฒ์์ ๋ชจ๋ ์์ด๊ฐ ์์ ์ ๋์๋ฅผ ๋ฟ๋ฆฐ ์ํ๋ฅผ ๋ํ๋ด๋ฉฐ, <ํ 1>์๋ ๊ฐ ์์ด ๋ฐ ํ์ฌ ๋ฐฉํฅ์ ๋ฐ๋ฅธ ์ฐ์ ์์๊ฐ ํ์๋์ด ์๋ค. ์ด ์์ ์์๋ k = 4์ด๋ค. ์ผ์ชฝ ํ๋จ์ ์ ํ ์ ์๋ ๋์๋ฅผ ์๋ฏธํ๊ณ , ๊ทธ ๊ฐ์ ์ฌ๋ผ์ง๊ธฐ๊น์ง ๋จ์ ์๊ฐ์ด๋ค. ์ข์ธก ์๋จ์ ์ ํ ์ ์๋ ์์ด์ ๋ฒํธ ๋๋ ๋์๋ฅผ ๋ฟ๋ฆฐ ์์ด์ ๋ฒํธ๋ฅผ ์๋ฏธํ๋ค.

<๊ทธ๋ฆผ 2>

<๊ทธ๋ฆผ 3>
<๊ทธ๋ฆผ 2>๋ ๋ชจ๋ ์์ด๊ฐ ํ ์นธ ์ด๋ํ๊ณ ์์ ์ ๋์๋ฅผ ๋ฟ๋ฆฐ ์ํ์ด๊ณ , <๊ทธ๋ฆผ 3>์ <๊ทธ๋ฆผ 2>์ ์ํ์์ ํ ์นธ ๋ ์ด๋ํ ๊ฒ์ด๋ค. (2, 4)์๋ ์์ด 2๊ณผ 4๊ฐ ๊ฐ์ด ๋๋ฌํ๊ธฐ ๋๋ฌธ์, ์์ด 4๋ ๊ฒฉ์ ๋ฐ์ผ๋ก ์ซ๊ฒจ๋ฌ๋ค.

<๊ทธ๋ฆผ 4>

<๊ทธ๋ฆผ 5>
<๊ทธ๋ฆผ 4>์ ๊ฒฉ์์ ๋จ์์๋ ๋ชจ๋ ์์ด๊ฐ ํ ์นธ ์ด๋ํ๊ณ ์์ ์ ๋์๋ฅผ ๋ฟ๋ฆฐ ์ํ, <๊ทธ๋ฆผ 5>๋ <๊ทธ๋ฆผ 4>์์ ํ ์นธ ๋ ์ด๋ํ ์ํ๋ฅผ ๋ํ๋ธ๋ค. ์์ด 2๋ ์ธ์ ํ ์นธ ์ค์ ์๋ฌด ๋์๋ ์๋ ์นธ์ด ์์ผ๋ฏ๋ก ์์ ์ ๋์๊ฐ ๋ค์ด์๋ (2, 4)์ผ๋ก ์ด๋ํ๋ค. ์์ด๊ฐ ์ด๋ํ ํ์, ๋งจ ์ฒ์์ ๊ฐ ์์ด๊ฐ ๋ฟ๋ฆฐ ๋์๋ ์ฌ๋ผ์ก๋ค.
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ ๋, 1๋ฒ ์์ด๋ง ๊ฒฉ์์ ๋จ๊ฒ ๋๊ธฐ๊น์ง ๋ช ์ด๊ฐ ๊ฑธ๋ฆฌ๋์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ์ค์๋ N, M, k๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000)
๊ทธ ๋ค์ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฒฉ์์ ๋ชจ์ต์ด ์ฃผ์ด์ง๋ค. 0์ ๋น์นธ์ด๊ณ , 0์ด ์๋ ์ x๋ x๋ฒ ์์ด๊ฐ ๋ค์ด์๋ ์นธ์ ์๋ฏธํ๋ค.
๊ทธ ๋ค์ ์ค์๋ ๊ฐ ์์ด์ ๋ฐฉํฅ์ด ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. 1, 2, 3, 4๋ ๊ฐ๊ฐ ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ์๋ฏธํ๋ค.
๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ ์์ด์ ๋ฐฉํฅ ์ฐ์ ์์๊ฐ ์์ด ๋น 4์ค์ฉ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ์ค์ 4๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ํ๋์ ์์ด๋ฅผ ๋ํ๋ด๋ ๋ค ์ค ์ค ์ฒซ ๋ฒ์งธ ์ค์ ํด๋น ์์ด๊ฐ ์๋ฅผ ํฅํ ๋์ ๋ฐฉํฅ ์ฐ์ ์์, ๋ ๋ฒ์งธ ์ค์ ์๋๋ฅผ ํฅํ ๋์ ์ฐ์ ์์, ์ธ ๋ฒ์งธ ์ค์ ์ผ์ชฝ์ ํฅํ ๋์ ์ฐ์ ์์, ๋ค ๋ฒ์งธ ์ค์ ์ค๋ฅธ์ชฝ์ ํฅํ ๋์ ์ฐ์ ์์์ด๋ค. ๊ฐ ์ฐ์ ์์์๋ 1๋ถํฐ 4๊น์ง์ ์์ฐ์๊ฐ ํ ๋ฒ์ฉ ๋ํ๋๋ค. ๊ฐ์ฅ ๋จผ์ ๋์ค๋ ๋ฐฉํฅ์ด ์ต์ฐ์ ์ด๋ค. ์๋ฅผ ๋ค์ด, ์ฐ์ ์์๊ฐ 1 3 2 4๋ผ๋ฉด, ๋ฐฉํฅ์ ์์๋ ์, ์ผ์ชฝ, ์๋, ์ค๋ฅธ์ชฝ์ด๋ค.
๋งจ ์ฒ์์๋ ๊ฐ ์์ด๋ง๋ค ์ธ์ ํ ๋น ์นธ์ด ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ์ฒ์๋ถํฐ ์ด๋์ ๋ชป ํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
1๋ฒ ์์ด๋ง ๊ฒฉ์์ ๋จ๊ฒ ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋จ, 1,000์ด๊ฐ ๋์ด๋ ๋ค๋ฅธ ์์ด๊ฐ ๊ฒฉ์์ ๋จ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ์์ฝ
์ด๋ฅธ ์์ด๋ค์ ์๋ก ์์ญ ์ธ์์ ํ๋ค. ์ซ์๊ฐ ์์ ์๋ก ๊ฐํ ์์ด์ด๋ค.
1์ด๋ง๋ค ์์ด๋ค์ ๋ค์๊ณผ ๊ฐ์ ํ๋์ ๋ฐ๋ณตํ๋ค.
- ์ํ์ข์ฐ ์ธ์ ํ ์นธ์ผ๋ก “๋์์” ์ด๋ํ๋ค.
- ๋์ฐฉํ ์นธ์ ๋์๋ฅผ ๋ฟ๋ฆฐ๋ค.
- ๋์๋ k๋ฒ ์ด๋ํ๋ฉด ์ฌ๋ผ์ง๋ค.
- ๋ชจ๋ ์์ด๊ฐ ์ด๋ ํ ํ ์นธ์ ์๋ ์์ด๋ ๊ฐ์ฅ ์ซ์๊ฐ ์์ ์์ด(๊ฐํ ์์ด)์ด๋ค.
์ด๋ ์ด๋ ์์น์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์๋ฌด ๋์ ์๋ ๊ณณ
- ์์ ์ ๋์๊ฐ ์๋ ๊ณณ
๊ฐ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ๊ณณ์ ํ๋๊ฐ ์๋์ ์๋๋ฐ ์ด๋๋ ํน์ ํ ๋ฐฉํฅ ์ฐ์ ์์๋ก ๊ฒฐ์ ํ๋ค. ์ฐ์ ์์๋ ์์ด๋ง๋ค ๋ค๋ฅด๋ค.
1๋ฒ ์์ด๋ง ๊ฒฉ์์ ๋จ์ ๋๊น์ง ๋ช์ด๊ฐ ๊ฑธ๋ฆฌ๋์ง ๊ตฌํ์!
์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, M ;
static int t, k;
static int[][] water;
static int[][][] dir;
static int[][][] smell;
static int[] D;
static int[] dx = {0, -1, 1, 0, 0};
static int[] dy = {0, 0, 0, -1, 1};
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
water = new int[N][N];
smell = new int[N][N][2];
for(int i=0; i<N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for(int j=0; j<N; j++) {
water[i][j] = Integer.parseInt(st.nextToken());
if(water[i][j] > 0) {smell[i][j][0] = water[i][j]; smell[i][j][1] = k;}
}
}
D = new int[M+1];
st = new StringTokenizer(bf.readLine(), " ");
for(int i = 1; i<=M; i++)
D[i] = Integer.parseInt(st.nextToken());
dir = new int[M+1][5][5];
for(int i=1; i<=M; i++) {
for(int d = 1; d<=4; d++) {
st = new StringTokenizer(bf.readLine(), " ");
for(int u=1; u<=4; u++)
dir[i][d][u] = Integer.parseInt(st.nextToken());
}
}
for(t=1; t<=1001; t++) {
if(t == 1001) break;
move();
if(M == 1) break;
}
if(t == 1001) t = -1;
System.out.println(t);
}
static void move() {
int[][] tmp = new int[N][N];
ArrayDeque<int[]> newsmell = new ArrayDeque<>();
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(water[i][j] == 0) continue;
int s = water[i][j]; int mx = N; int my = N; int md = 0;
for(int d = 1; d<=4; d++) {
int ni = i + dx[dir[s][D[s]][d]];
int nj = j + dy[dir[s][D[s]][d]];
if(ni < 0 || nj < 0 || ni >= N || nj >= N) continue;
if(smell[ni][nj][0] != s && smell[ni][nj][1] >= t) continue;
if(smell[ni][nj][1] < t) {mx = ni; my = nj; md = dir[s][D[s]][d]; break;} // ์ต์ ์ ์ฐพ์์ผ๋ฏ๋ก ๋๊ฐ๋ ๋จ
else if(smell[ni][nj][0] == s && mx == N) // mx๊ฐ ์๋ฌด ์ ํ๋ ์๋ ๊ฒฝ์ฐ -> ๊ฐ์ฅ ์ฒ์์ ์ ํ๋ ๋ฐฉํฅ์ด ๋จ
{mx = ni; my = nj; md = dir[s][D[s]][d];}
}
if(tmp[mx][my] == 0) {tmp[mx][my] = water[i][j]; newsmell.offer(new int[] {mx, my, s, t+k});}
else if(tmp[mx][my] > water[i][j]) {tmp[mx][my] = water[i][j]; M--; newsmell.offer(new int[] {mx, my, s, t+k});}
else {M--;}
D[s] = md;
}
}
while(!newsmell.isEmpty()) {
int[] n = newsmell.poll();
smell[n[0]][n[1]][0] = n[2];
smell[n[0]][n[1]][1] = n[3];
}
water = tmp;
}
}
ํ์ค์ฉ ์ดํด๋ณด์
static int N, M ;
static int t, k;
static int[][] water;
static int[][][] dir;
static int[][][] smell;
static int[] D;
static int[] dx = {0, -1, 1, 0, 0};
static int[] dy = {0, 0, 0, -1, 1};
N, M, k, water๋ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ์ ์ฅํ๋ ๋ณ์์ด๋ค.
t๋ ํ์ฌ๊น์ง ํ๋ฅธ ์ด๋ฅผ ๋ํ๋ธ๋ค.
dir๋ ์ด๋ฅธ ์์ด๋ค์ ๋ฐฉํฅ ์ฐ์ ์์ ์ ๋ณด๋ฅผ ๋ํ๋ธ๋ค.
์๋ฅผ ๋ค์ด dir[1][1][1] : 1๋ฒ ์์ด๊ฐ ํ์ฌ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด 1์ผ ๋ ์ต๊ณ ์ฐ์ ์์(1์)
smell์ ํด๋น ์์น์ ๋์์ ์ฃผ์ธ๊ณผ ๋์๋ฅผ ๋จ๊ธด ์๊ฐ + k๋ฅผ ์ ์ฅํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ๋ก ๋ถํฐ k์ด ํ๋ถํฐ ์ด ์์น๋ก ์ด๋์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋ ์ ๋ณด์ ๋ฐฉํฅ์ 1~4์ด๋ฏ๋ก ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋๋ก 0์๋ ์ ๋ณด๋ฅผ ์ฃผ์ง ์์๋ค.
D์๋ ์์ด๋ค์ ํ์ฌ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์ฅํด์ค๋ค.
for(int i=0; i<N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for(int j=0; j<N; j++) {
water[i][j] = Integer.parseInt(st.nextToken());
if(water[i][j] > 0) {smell[i][j][0] = water[i][j]; smell[i][j][1] = k;}
}
}
์ฒ์ ์์ํ๋ ์์น์๋ ๋์๋ฅผ ๋ฟ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ๊ณผ ๋์์ smell์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
dir = new int[M+1][5][5];
for(int i=1; i<=M; i++) {
for(int d = 1; d<=4; d++) {
st = new StringTokenizer(bf.readLine(), " ");
for(int u=1; u<=4; u++)
dir[i][d][u] = Integer.parseInt(st.nextToken());
}
}
for(t=1; t<=1001; t++) {
if(t == 1001) break;
move();
if(M == 1) break;
}
if(t == 1001) t = -1;
dir ๋ณ์์ ์์ด์ ์ด๋ ์์น ์ฐ์ ์์๋ฅผ ์ ์ฅํด์ค๋ค. ์ด๋ ๋ฐฉํฅ์ 1~4๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ 5๋ก ์ ์ธํด์ค๋ค.
1000์ด ์ดํ ์ด๋์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ 1001์ for๋ฌธ์ ์ข ๋ฃํ๋ค. ์ด๋์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ -1๋ฅผ ์ถ๋ ฅํด์ค๋ค.
int[][] tmp = new int[N][N];
ArrayDeque<int[]> newsmell = new ArrayDeque<>();
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(water[i][j] == 0) continue;
int s = water[i][j]; int mx = N; int my = N; int md = 0;
move()๋ ์์ด๋ฅผ ์ด๋์ํค๋ ํจ์์ด๋ค. ์ด๋๋ ์์น์ ํ์ฌ ์์น๋ฅผ ํผ๋ํ์ง ์๋๋ก tmp๋ฅผ ์ ์ธํด์ ์ ์ฅํด์ค ๊ฒ์ด๋ค.
์๋ก์ด ๋์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ deque์ ์ ์ธํ๋ค. ๋ง์ฝ ๋ฐ๋ก smell์ ์ ์ฅํ๋ค๋ฉด ๊ฐฑ์ ๋ smell ๋ฐฐ์ด๋ก ์ธํด ๋์์ ์ด๋ํ๋ ์์ด๋ฅผ ํํํ ์ ์๊ฒ ๋๋ค.
์๋ฅผ๋ค์ด 1๋ฒ ์์ด๊ฐ (1, 2)๋ก ์ด๋ํ์ฌ ๋์๋ฅผ ๋จ๊ธฐ๋ฉด 2๋ฒ ์์ด๋ (1, 2)๋ก ์ด๋ํ ์ ์๊ฒ ๋๋ค.
์์ด๊ฐ ์๋ ์์น๋ฅผ ํ์ธํ๊ณ s์ ์์ด์ ์ซ์๋ฅผ ์ ์ฅํด์ค๋ค. mx, my, md๋ฅผ ํตํด ๊ฐฑ์ ๋๋ ์์ด์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๊ฒ์ด๋ค.
for(int d = 1; d<=4; d++) {
int ni = i + dx[dir[s][D[s]][d]];
int nj = j + dy[dir[s][D[s]][d]];
if(ni < 0 || nj < 0 || ni >= N || nj >= N) continue;
if(smell[ni][nj][0] != s && smell[ni][nj][1] >= t) continue;
if(smell[ni][nj][1] < t) {mx = ni; my = nj; md = dir[s][D[s]][d]; break;} // ์ต์ ์ ์ฐพ์์ผ๋ฏ๋ก ๋๊ฐ๋ ๋จ
else if(smell[ni][nj][0] == s && mx == N) // mx๊ฐ ์๋ฌด ์ ํ๋ ์๋ ๊ฒฝ์ฐ -> ๊ฐ์ฅ ์ฒ์์ ์ ํ๋ ๋ฐฉํฅ์ด ๋จ
{mx = ni; my = nj; md = dir[s][D[s]][d];}
}
4๋ฐฉํฅ์ ๋ชจ๋ ํ์ํ ๊ฒ์ด๋ค. dir[s][D[s]][d] ์๋ s๋ฒ ์์ด์ ํ์ฌ ์์น (D[s])์ผ ๋ d๋ฒ์งธ ์ฐ์ ์์ ๋ฐฉํฅ์ด ๋ด๊ฒจ์๋ค. ์ฐ์ ์์ ๋๋ก ํ์ํ๊ณ ๊ฒฉ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ค๋ฅธ ์์ด์ ๋์๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ continue์ฒ๋ฆฌํ๋ค. ๋ง์ฝ ๋์๋ฅผ ๋จ๊ธด ์๊ฐ์ด t๋ณด๋ค ์๋ค๋ฉด ์๋ฌด ๋์๊ฐ ๋จ์์์ง ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก 1์์๋ก ์ด๋๊ฐ๋ฅํ ๊ณณ์ด ๋๋ค. ๋ฐ๋ก break๋ฅผ ํด๋ ๋๋ค.
ํ์ง๋ง ๊ทธ๋ฌํ ๊ณณ์ด ์๋ ๊ฒฝ์ฐ ์์ ์ ๋์๊ฐ ์๋ ๊ณณ์ผ๋ก ์ด๋ํด์ผ ํ๋ฏ๋ก ๊ฐ์ฅ ๋จผ์ ๋ง๋ ๊ณณ์ mx, my์ ์ ์ฅํด์ค๋ค.
if(tmp[mx][my] == 0) {tmp[mx][my] = water[i][j]; newsmell.offer(new int[] {mx, my, s, t+k});}
else if(tmp[mx][my] > water[i][j]) {tmp[mx][my] = water[i][j]; M--; newsmell.offer(new int[] {mx, my, s, t+k});}
else {M--;}
D[s] = md;
}
}
while(!newsmell.isEmpty()) {
int[] n = newsmell.poll();
smell[n[0]][n[1]][0] = n[2];
smell[n[0]][n[1]][1] = n[3];
}
water = tmp;
ํด๋น ์์น์ ์์ด๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์ด๋ ๊ฐ๋ฅํ๋ฏ๋ก ์ด๋ํด์ค๋ค.
๋ง์ฝ ํด๋น ์์น์ ์์ด๊ฐ ์์ ๋ณด๋ค ํฐ ์๋ฅผ ๊ฐ์ก๋ค๋ฉด ์ด๋๊ฐ๋ฅํ๊ณ ์์ด ํ๋ง๋ฆฌ๊ฐ ๊ฒฉ์ ๋ฐ์ผ๋ก ๋ฒ์ด๋๊ฒ ๋๊ธฐ ๋๋ฌธ์ M์ ๊ฐ์์ํจ๋ค.
๋ ๊ฒฝ์ฐ์ ํด๋นํ์ง ์์ผ๋ฉด ๊ฒฉ์ ๋ฐ์ผ๋ก ๋๊ฐ์ผ ๋๋ฏ๋ก ๋ํ M์ ๊ฐ์ํ๋ค.
์ด๋์ด ๋ชจ๋ ์ข ๋ฃ๋์ผ๋ฏ๋ก smell์ ์ ์ฅํด์ค๋ค. ๊ตณ์ด ๊ฒฉ์์ ๋ค๋ฅธ ์์ด๊ฐ ์๋์ง ์กฐ์ฌํ ํ์์์ด ๋ค์ด์จ ์์๋๋ก smell ๋ฐฐ์ด์ ์ ์ฅํด์ฃผ์ด๋ ๊ฒฉ์์ ๋จ์ ์์ด์ ๊ฒ์ด ๋ง์ง๋ง์ ๋ค์ด์๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ๋ค.
๋ง์ง๋ง์ผ๋ก ์ด๋๋ ์์น๋ก water๋ฅผ ๋ณ๊ฒฝํ๋ค.
'๐ Problem Solving > ๐ป Samsung SW Expert' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 17070 ํ์ดํ์ฎ๊ธฐ๊ธฐ1 (0) | 2023.03.29 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 17825 ์ฃผ์ฌ์ ์ท๋์ด (0) | 2023.03.06 |
[JAVA] BOJ ๋ฐฑ์ค 20061 ๋ชจ๋ ธ๋ฏธ๋ ธ๋๋ฏธ๋ ธ 2 (1) | 2023.03.05 |
[JAVA] BOJ ๋ฐฑ์ค 15685 ๋๋๊ณค ์ปค๋ธ (0) | 2023.02.25 |
[JAVA] BOJ ๋ฐฑ์ค 14890 ๊ฒฝ์ฌ๋ก (0) | 2023.02.18 |