๋ฌธ์
https://www.acmicpc.net/problem/20056
๋ฌธ์ ์ดํด
- N×N ๊ฒฉ์์์ ํ์ด์ด๋ณผ๋ค์ด K๋ฒ ์ด๋·ํฉ์ฒด·๋ถ๋ฆฌ๋๋ค.
- ๊ฐ ํ์ด์ด๋ณผ: ์์น
(r,c), ์ง๋m, ์๋ ฅs, ๋ฐฉํฅd(0~7). - ํ ์นธ์ 2๊ฐ ์ด์ ๋ชจ์ด๋ฉด ํ๋๋ก ํฉ์น ๋ค 4๊ฐ๋ก ๋ถ๋ฆฌ
- ์ ์ง๋ = ⌊(ํฉ ์ง๋)/5⌋ (0์ด๋ฉด ์๋ฉธ)
- ์ ์๋ ฅ = ⌊(ํฉ ์๋ ฅ)/๊ฐ์⌋
- ์ ๋ฐฉํฅ: ๋ชจ๋ ์ง/ํ๋ง ์์์ผ๋ฉด
{0,2,4,6}, ์์ฌ ์์ผ๋ฉด{1,3,5,7}
๊ตฌํ ํ๋ฆ
- ์
๋ ฅ
fireBall๋ฆฌ์คํธ์ ๋ชจ๋ ํ์ด์ด๋ณผ ์ ์ฅmap[r][c]์๋ ํด๋น ์นธ์ ์กด์ฌํ๋ ํ์ด์ด๋ณผ ์ ์ฅ
- K๋ฒ ๋ฐ๋ณต
- ์ด๋
move()- ๋ชจ๋ ํ์ด์ด๋ณผ์ ๋ฐฉํฅ·์๋ ฅ๋๋ก ์ด๋
- ์ด๋ ํ
map์ ์ฝ์
- ํฉ์ฒด ํ 4๋ถ๋ฆฌ
divide(int r, int c)map[i][j] >= 2์ธ ์นธ๋งdivide(i, j)์ํmap์ด๊ธฐํ
- ์ด๋
- ์ถ๋ ฅ
calcSum()๋ก ๋จ์ ๋ชจ๋ ํ์ด์ด๋ณผ์ ์ง๋ ํฉ ์ถ๋ ฅ
ํจ์๋ณ ์์ธ ๊ธฐ๋ฅ
move(): ํ์ด์ด๋ณผ ์ด๋
๋ฐฉํฅ d๋ก s์นธ ์ด๋. ๊ฒฉ์์ ๋ฒ์, ์์๋ฅผ ๊ณ ๋ คํ์ฌ (r + dr[d] * (s % n) + n) % n๋ก ์ฒ๋ฆฌ
s % n:s์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ถ์
divide(int r, int c): ํฉ์ฒด ํ 4๋ถ๋ฆฌ
map์ ํด๋น ์นธ์ ํ ๋ฒ ์ํํ๋ฉฐ, ์ง๋ ํฉ (m), ์๋ ฅ ํฉ (s), ํ์ด์ด๋ณผ ๊ฐ์ ํฉ (cnt), ์ง/ํ ์ฌ๋ถ (even/odd) ์ง๊ณ- ํฉ์ฒด๋ ํ์ด์ด๋ณผ ์ ๊ฑฐ:
fireBall.remove(cur) - ์ง๊ณ ํ
map์ด๊ธฐํ - ์ ์ง๋, ์๋ ฅ, ๋ฐฉํฅ ๊ตฌํ๊ธฐ
- ์ ์ง๋:
m /= 5(0์ด๋ฉด ์๋ฉธ) - ์ ์๋ ฅ:
s /= cnt - ์ง/ํ ์์ ์ฌ๋ถ
(odd && even)์ ๋ฐ๋ผ ๋ฐฉํฅ ์งํฉ์{0,2,4,6}๋๋{1,3,5,7}์ผ๋ก 4๊ฐ ์์ฑํดfireBall์ ์ถ๊ฐ
- ์ ์ง๋:
calcSum(): ๋จ์ ์ง๋ ํฉ์ฐ
fireBall๋ฆฌ์คํธ ์ํํ๋ฉฐm์ ๋์ ํด์ ๋ฆฌํด
์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static class FireBall {
int r, c, m, s, d;
public FireBall(int r, int c, int m, int s, int d) {
this.r = r;
this.c = c;
this.m = m;
this.s = s;
this.d = d;
}
}
static int n;
static ArrayList<FireBall>[][] map;
static ArrayList<FireBall> fireBall;
static int[] dr = { -1, -1, 0, 1, 1, 1, 0, -1 };
static int[] dc = { 0, 1, 1, 1, 0, -1, -1, -1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
map = new ArrayList[n][n];
fireBall = new ArrayList<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = new ArrayList<>();
}
}
while (m-- > 0) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken()) - 1;
int c = Integer.parseInt(st.nextToken()) - 1;
fireBall.add(new FireBall(r, c, Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken())));
} // ์
๋ ฅ ๋
while (k-- > 0) { // ๋ช
๋ น
move();
// ํ์ด์ด๋ณผ ๋ถ๋ฆฌ & map ์ด๊ธฐํ
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j].size() < 2) {
map[i][j].clear();
continue;
}
divide(i, j);
}
}
}
System.out.println(calcSum());
}
static void move() { // ํ์ด์ด๋ณผ ์ด๋
for (FireBall f : fireBall) {
f.r = (f.r + n + dr[f.d] * (f.s % n)) % n;
f.c = (f.c + n + dc[f.d] * (f.s % n)) % n;
map[f.r][f.c].add(f);
}
}
static void divide(int r, int c) { // ํ์ด์ด๋ณผ ๋ถ๋ฆฌ
int m = 0, s = 0, cnt = map[r][c].size();
boolean odd = false, even = false;
for (FireBall cur : map[r][c]) {
m += cur.m;
s += cur.s;
if (cur.d % 2 == 0)
even = true;
else
odd = true;
fireBall.remove(cur);
}
map[r][c].clear();
m /= 5;
if (m == 0) { // ์๋ฉธ
return;
}
s /= cnt;
if (odd && even) {
for (int i = 1; i < 8; i += 2) {
fireBall.add(new FireBall(r, c, m, s, i));
}
} else {
for (int i = 0; i < 8; i += 2) {
fireBall.add(new FireBall(r, c, m, s, i));
}
}
}
static int calcSum() { // ์ง๋ ํฉ
int ans = 0;
for (FireBall f : fireBall) {
ans += f.m;
}
return ans;
}
}'๐ญ Problem Solving > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][Java] 11437. LCA (0) | 2025.10.28 |
|---|---|
| [BOJ][Java] 21608. ์์ด ์ด๋ฑํ๊ต (3) | 2025.10.21 |
| [BOJ][Java] 16236. ์๊ธฐ ์์ด (0) | 2025.10.01 |
| [BOJ][Java] 2533. ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2025.09.24 |
| [BOJ][Java] 15486. ํด์ฌ 2 (0) | 2025.09.15 |