https://www.acmicpc.net/problem/21610
1. ๋ฌธ์
NxN ํฌ๊ธฐ์ map์ด ์ฃผ์ด์ง๊ณ ๋น๊ตฌ๋ฆ์ ์์์์น๋ (N, 1), (N, 2), (N-1, 1), (N-1, 2)์ด๋ค.
์ด ๋น๊ตฌ๋ฆ์ ์ด๋ ์ ๋ณด๋ M๋ฒ ์ฃผ์ด์ง๊ณ ๋ฐฉํฅ, ํ์๋ก ์ฃผ์ด์ง๋ค.
๋ฐฉํฅ์ 1๋ถํฐ ์์๋๋ก ←, โ, ↑, โ, →, โ, ↓, โ ์ด๋ค.
1. ๋ชจ๋ ๊ตฌ๋ฆ์ด d๋ฐฉํฅ์ผ๋ก s์นธ ์ด๋
2. ๊ตฌ๋ฆ์์ ๋น๊ฐ ๋ด๋ ค map์ +1
3. ๋๊ฐ์ ์นธ์ ๋ฌผ์ด ์์ผ๋ฉด ๋ฌผ์ด ์๋ ์นธ ์๋งํผ +
4. ๊ตฌ๋ฆ ๋ค์ ์ธํ -> ์ด์ ๊ตฌ๋ฆ ์์น ์ ์ธํ๊ณ ๋ฌผ ์์ด 2 ์ด์์ด๋ฉด ๊ตฌ๋ฆ
2. ํ์ด
์๋ฎฌ๋ ์ด์ ๋ฌธ์ ์ด๋ค.
๋ด๊ฐ ๋์น ๋ถ๋ถ์ 2๊ฐ์ง์๋ค.
1. ๊ตฌ๋ฆ ์ขํ๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ๋ก ์ฒ์์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด์ removeํ ๋ ์ธ๋ฑ์ค ๋๋ฌธ์ ํท๊ฐ๋ ธ๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ ํ๋ก ๋ณ๊ฒฝํ์๋๋ ๊ธ๋ฐฉ ํ ์ ์์๋ค.
2. ๋น ๋ด๋ฆฌ๊ณ ๋น๋ฐ๋ผ๊ธฐ๋ฅผ ์์ ํ ๋ ๋์์ ์ฒ๋ฆฌํ์ฌ ๋๊ฐ์ ์ฒดํฌ ์ ์๋ชป๋ ๊ฐ์ผ๋ก ์ฒดํฌ๋์๋ค.
๋ชจ๋ ๊ตฌ๋ฆ ์ขํ์ +1์ ๋จผ์ ํ ๋ค์, ๋๊ฐ์ ์ฒดํฌ๋ฅผ ํด์ค์ผ ํ๋๋ฐ
๋๋ ์ขํ๋ง๋ค +1 ํ ๋๊ฐ์ ์ฒดํฌ๋ฅผ ํด์คฌ๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ๋๊ฐ์ ์ขํ๊ฐ 0์ด ์๋๋ฐ๋ 0์ผ๋ก ์ฒดํฌํ๊ณ ๋ํ์ง ์๋ ์ํฉ์ด ๋ฐ์ํ์๋ค.
3. ์ฝ๋
import java.io.*;
import java.util.*;
public class ๋ง๋ฒ์ฌ์์ด์๋น๋ฐ๋ผ๊ธฐ {
static int N, M, map[][], ans;
static Queue<int[]> cloudQ = new ArrayDeque<> ();
static List<int[]> lastCloudList;
static List<int[]> moveInfoList = new ArrayList<> ();
static int[] dy = { 0,-1,-1,-1, 0, 1, 1, 1};
static int[] dx = {-1,-1, 0, 1, 1, 1, 0,-1};
static int[] cy = {-1,-1, 1, 1};
static int[] cx = {-1, 1, 1,-1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N+1][N+1]; // 0 dummy
for (int i = 1; i<=N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j<=N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int dir = Integer.parseInt(st.nextToken());
int cnt = Integer.parseInt(st.nextToken());
moveInfoList.add(new int[] {dir, cnt});
}
// ๊ตฌ๋ฆ ์ขํ ์ ์ฅ
cloudQ.offer(new int[] {N-1,1});
cloudQ.offer(new int[] {N-1,2});
cloudQ.offer(new int[] {N,1});
cloudQ.offer(new int[] {N,2});
// ์
๋ ฅ ๋
solution();
System.out.println(ans);
}
static void solution() {
for (int i=0; i<M; i++) {
move(moveInfoList.get(i)[0]-1, moveInfoList.get(i)[1]);
rain();
setCloud();
}
for (int i = 1; i<=N; i++) {
for (int j = 1; j<=N; j++) {
ans += map[i][j];
}
}
}
static void move(int dir, int cnt) {
int len = cloudQ.size();
for (int i=0; i<len; i++) {
int[] lastLoc = cloudQ.poll();
int y = lastLoc[0];
int x = lastLoc[1];
int ny = y;
int nx = x;
for (int c = 0; c<cnt ;c++) {
if (ny + dy[dir] <= 0) ny = N;
else if (ny + dy[dir] > N) ny = 1;
else ny += dy[dir];
if (nx + dx[dir] <= 0) nx = N;
else if (nx + dx[dir] > N) nx = 1;
else nx += dx[dir];
}
cloudQ.offer(new int[] {ny, nx});
}
}
static void rain() {
// ๋น
for (int[] loc : cloudQ) {
map[loc[0]][loc[1]]++;
}
//๋น๋ฐ๋ผ๊ธฐ
for (int[] loc : cloudQ) {
int y = loc[0];
int x = loc[1];
int cnt = 0;
for (int crossD = 0; crossD < 4; crossD++) {
int ny = y+cy[crossD];
int nx = x+cx[crossD];
if (ny<=0 || ny>N || nx<=0 || nx>N) continue;
if (map[ny][nx] > 0) cnt++;
}
map[y][x] += cnt;
}
}
static void setCloud() {
lastCloudList = new ArrayList<> ();
while (!cloudQ.isEmpty()) {
lastCloudList.add(cloudQ.poll());
}
for (int i=1; i<=N; i++) {
for (int j=1; j<=N; j++) {
if (map[i][j] >= 2) {
if (lastCloudCheck(i, j)) continue;
map[i][j] -= 2;
cloudQ.offer(new int[] {i, j});
}
}
}
}
static boolean lastCloudCheck(int i, int j) {
for (int[] loc : lastCloudList) {
if (loc[0] == i && loc[1] == j) {
return true;
}
}
return false;
}
}
4. ์ฌ๋ด
์ค๋๋ง์ ํธ๋๊น ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ์ง๋ง ์ ๋ง ์ฌ๋ฐ์๋ค.
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 14500 ํ ํธ๋ก๋ฏธ๋ ธ - Java (1) | 2023.10.18 |
---|---|
[BOJ] 14499 ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ - Java (1) | 2023.10.17 |
[BOJ] 1182 ๋ถ๋ถ์์ด์ ํฉ - Java (1) | 2023.09.16 |
[BOJ] 3190 ๋ฑ - Java (1) | 2023.09.14 |
[BOJ] 13458 ์ํ๊ฐ๋ - Java (0) | 2023.09.13 |