https://www.acmicpc.net/problem/21610
๋ฌธ์ ์ค๋ช
`A[r][c]` : (r,c)์ ์๋ ๋ฐ๊ตฌ๋์ ์ ์ฅ๋์ด ์๋ ๋ฌผ์ ์ (1$\leq$r,c$\leq$N) 1๋ฒ ํ๊ณผ N๋ฒ ํ, 1๋ฒ ์ด๊ณผ N๋ฒ ์ด์ ์ฐ๊ฒฐ๋์ด ์๋ค ๐ **๋ฒ์ ๋ฒ์ด๋จ์ด ์๋ค**
์ฒ์ ๋น๋ฐ๋ผ๊ธฐ ์์ โก๏ธ (N,1), (N,2), (N-1,1), (N-1,2)์ ๋น๊ตฌ๋ฆ์ด ์์ฑ์ด์ M๋ฒ์ ์ด๋ ๋ช
๋ น
: i๋ฒ์งธ ์ด๋ ๋ช
๋ น์ ๋ฐฉํฅ $d_i$๊ณผ ๊ฑฐ๋ฆฌ $s_i$๋ฐฉํฅ
- 1 : (0,-1)
- 2 : (-1,-1)
- 3 : (-1,0)
- 4 : (-1,1)
- 5 : (0,1)
- 6 : (1,1)
- 7 : (1,0)
- 8 : (1,-1)
์ด๋์ ๋ช ๋ นํ๋ฉด
- ๋ชจ๋ ๊ตฌ๋ฆ์ด $d_i$๋ฐฉํฅ์ผ๋ก $s_i$์นธ ์ด๋
- ๋น๊ฐ ๋ด๋ ค ๊ฐ ์นธ์ ๋ฐ๊ตฌ๋์ ๋ฌผ์ ์ +1
- ๊ตฌ๋ฆ์ด ๋ชจ๋ ์ฌ๋ผ์ง
- 2์์ ๋ฌผ์ด ์ฆ๊ฐํ ์นธ (r,c)์ ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ ์์
-> ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ์นธ์ ๋ฌผ์ด ์๋ ๋ฐ๊ตฌ๋ ์๋งํผ (r,c)์ ์๋ ๋ฐ๊ตฌ๋์ ๋ฌผ์ ์์ด ์ฆ๊ฐ
์ด๋๋ ๊ฒฝ๊ณ๊ฐ ๋์ด๊ฐ๋ฉด ์๋จ - ๋ฐ๊ตฌ๋์ ๋ฌผ์ ์์ด 2 ์ด์์ธ ๋ชจ๋ ์นธ์ ๊ตฌ๋ฆ์ด ์๊ธฐ๊ณ , ๋ฌผ์ ์ -2, ์ด๋ 3์์ ์ฌ๋ผ์ง ์นธ์ ์ ์ธ
ํ์ด
1. ์ ๋ ฅ
WaterOfBucket[][]
: ๊ฐ ๋ฐ๊ตฌ๋์ ๋ฌผ์ ์
์ด๊ธฐ ๊ตฌ๋ฆ์ ์์น (N,1), (N,2), (N-1,1), (N-1,2)์ cloud
์ ์ ์ฅ
2. ๊ตฌ๋ฆ ์ด๋ & ๋น ๋ด๋ฆฌ๊ธฐ
MoveCloud(int d, int s)
cloud์ ์ ์ฅ๋ ๊ฐ ๊ตฌ๋ฆ์ ์ด๋
๋ค์ ์์น
nx = (x + N + dx[d] * s % N) % N
ny = (y + N + dy[d] * s % N) % N
์ด๋ค.
์์๊ฐ ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ N์ ๋ํ๊ณ ์ฒซ ํ/์ด๊ณผ ๋ง์ง๋ง ํ/์ด์ด ์ฐ๊ฒฐ๋์ด์๊ธฐ ๋๋ฌธ์ N์ผ๋ก ๋๋์ด ์ค๋ค.
WaterOfBucket[nx][ny] += 1 ํด์ค์ผ๋ก ๋ฌผ์ ์์ ์ฆ๊ฐ
๋์ผํ ๊ณณ์ ๊ตฌ๋ฆ์ด ์๊ธฐ์ง ์๊ฒ ํ๋๋ก isVisited[nx][ny] = true ํด์ค๋ค.
3. ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ ์์
checkDiagonal()
- cloud์ ๊ตฌ๋ฆ๋ค์ ๋๊ฐ์ ์ ํ์ธ
- ๋ฒ์๊ฐ 1$\leq$x,y$\leq$N ๋ผ๋ฉด cnt += 1
- cnt ๋งํผ WaterOfBucket[x][y] += cnt
4. ๊ตฌ๋ฆ ์ง์ฐ๊ธฐ & ๊ตฌ๋ฆ ์์ฑ
makeCloud()
cloud = new ArrayList<>();
๋ก ๊ตฌ๋ฆ ์ง์ฐ๊ธฐ
๊ฐ ์นธ์ ๋๋ฉด์ ๋ฌผ์ ์์ด 2์ด์์ด๊ณ , !isVisited[x][y]๋ผ๋ฉด
WaterOfBucket[x][y] -=2
cloud.add(new int[]{x,y})
ํด์ค๋ค.
1, 2, 3์ M๋ฒ ์ํ ํ, ๋ฌผ์ ์ ๊ณ์ฐ
calOfWater()
๊ฐ ์นธ์ ๋๋ฉด์ ๋ฌผ์ ์์ ๋ํ ํ, return
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main_BOJ_21610_๋ง๋ฒ์ฌ_์์ด์_๋น๋ฐ๋ผ๊ธฐ {
static int N, M, d, s;
static int[][] WaterOfBucket;
static boolean[][] isVisited;
static List<int[]> cloud;
static int[] dx = {0, 0, -1, -1, -1, 0, 1, 1, 1};
static int[] dy = {0, -1, -1, 0, 1, 1, 1, 0, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
M = Integer.parseInt(stringTokenizer.nextToken());
WaterOfBucket = new int[N][N];
for(int i = 0 ; i < N ; i++){
stringTokenizer = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
WaterOfBucket[i][j] = Integer.parseInt(stringTokenizer.nextToken());
}
}
cloud = new ArrayList<>();
cloud.add(new int[]{N-2,0});
cloud.add(new int[]{N-2,1});
cloud.add(new int[]{N-1,0});
cloud.add(new int[]{N-1,1});
for (int i = 0; i < M; i++) {
stringTokenizer = new StringTokenizer(br.readLine());
d = Integer.parseInt(stringTokenizer.nextToken());
s = Integer.parseInt(stringTokenizer.nextToken());
isVisited = new boolean[N][N];
MoveCloud(d, s);
checkDiagonal();
makeCloud();
}
int result = calOfWater();
System.out.println(result);
}
private static int calOfWater() {
int sum = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sum += WaterOfBucket[i][j];
}
}
return sum;
}
private static void makeCloud() {
cloud = new ArrayList<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (WaterOfBucket[i][j] >= 2 && !isVisited[i][j]) {
WaterOfBucket[i][j] -= 2;
cloud.add(new int[]{i, j});
}
}
}
}
private static void checkDiagonal() {
for (int[] c : cloud) {
int cnt = 0;
for (int d = 2; d < 9; d += 2) {
int nx = c[0] + dx[d];
int ny = c[1] + dy[d];
if (nx < 0 || ny < 0 || N <= nx || N <= ny) continue;
if(WaterOfBucket[nx][ny] > 0) cnt++;
}
WaterOfBucket[c[0]][c[1]] += cnt;
}
}
private static void MoveCloud(int d, int s) {
for (int[] c : cloud) {
int nx = (c[0] + N + dx[d] * s % N) % N;
int ny = (c[1] + N + dy[d] * s % N) % N;
isVisited[nx][ny] = true;
WaterOfBucket[nx][ny] += 1;
c[0] = nx;
c[1] = ny;
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ๋ฐฑ์ค / BOJ 16236 ] ์๊ธฐ ์์ด ( ์๋ฐ/JAVA ) (0) | 2022.01.30 |
---|---|
[ ๋ฐฑ์ค / BOJ 17144 ] ๋ฏธ์ธ๋จผ์ง ์๋ ! ( JAVA ) (0) | 2022.01.30 |
[ ๋ฐฑ์ค / BOJ 16234 ] ์ธ๊ตฌ ์ด๋ ( JAVA ) (0) | 2022.01.30 |
[ ๋ฐฑ์ค / BOJ 1487 ] ๋ฌผ๊ฑด ํ๊ธฐ ( ์๋ฐ / JAVA ) (0) | 2021.11.24 |
[ ๋ฐฑ์ค / BOJ 2583 ] ์์ญ ๊ตฌํ๊ธฐ ( JAVA / ์๋ฐ ) (0) | 2021.11.24 |