๐SWEA_SW_2382
๐ [SW_2382] ๋ฏธ์๋ฌผ ๊ฒฉ๋ฆฌ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Solution{
// ๋น๊ตํ๊ธฐ์ํด
static class Point implements Comparable<Point> {
// ํ, ์ด, ๊ตฐ์งํฌ๊ธฐ ,๋ฐฉํฅ
int x, y, num, way;
public Point(int y, int x, int num, int way) {
this.x = x;
this.y = y;
this.num = num;
this.way = way;
}
// ํฌ๊ธฐ๋น๊ต
@Override
public int compareTo(Point o) {
// ์์๋ 0์ด ๋์ค๋ฉด ๊ทธ๋๋ก ์์๊ฐ ๋์ค๋ฉด ์ด๋
// return this.num - o.num; // ์ค๋ฆ์ฐจ์์๊ฒฐ๊ณผ -> ์ต์ํ
return o.num - this.num; // ๋ด๋ฆผ์ฐจ์์ ๊ฒฐ๊ณผ -> ์ต๋ํ
}
}
static PriorityQueue<Point> pQueue;
static Point map[][];
static int N, M, K;
static int[] dy = { 0, -1, 1, 0, 0 }; // way๋ฅผ ๋ณ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ด๋ ๊ฒ ํด์ค
static int[] dx = { 0, 0, 0, -1, 1 }; // 0 : ์ฌ์ฉํ์ง์์, ์ : 1, ํ : 2, ์ข : 3, ์ฐ : 4
static StringTokenizer st = null;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
sb.append("#").append(tc).append(" ");
st = new StringTokenizer(br.readLine(), " ");
// ์
์ ๊ฐ์
N = Integer.parseInt(st.nextToken());
// ๊ฒฉ๋ฆฌ์๊ฐ
M = Integer.parseInt(st.nextToken());
// ๋ฏธ์๋ฌผ ๊ตฐ์ง์ ์
K = Integer.parseInt(st.nextToken());
map = new Point[N][N];
pQueue = new PriorityQueue<Point>();
// ๋ฏธ์๋ฌผ ์
๋ ฅ ๋ฐ๊ธฐ
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine(), " ");
pQueue.add(new Point(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
}
sb.append(move()).append("\n");
}
System.out.println(sb);
}
// ์ฃผ์ด์ง M ์๊ฐ๋์ ๋ฏธ์๋ฌผ ์ด๋ ์ฒ๋ฆฌ
static int move() {
int time = M, nx, ny, remainNum = 0;
// ์ ์ฒด ์๊ฐ
while (time>0) {
// ๊ตฐ์ง๋ฆฌ์คํธ์์ ๊ตฐ์ง๋ค์ ํ๋์ฉ ๋ชจ๋ ๊บผ๋ด์ ์ฒ๋ฆฌ
Point p;
// 1์๊ฐ ๋์
while (!pQueue.isEmpty()) {
// ๊ฐ์ฅ ํฐ ๊ฑฐ ๋จผ์ ๋์จ๋ค
p = pQueue.poll();
// ๊ฐ์ ๋ํด์ฃผ๊ณ nx,ny์ ๋ฃ์ด์ฃผ์๋ค.
nx = p.x += dx[p.way];
ny = p.y += dy[p.way];
// ๊ฐ์ฅ์๋ฆฌ์ ๋์ฐฉํ ๊ฒฝ์ฐ
if (nx == 0 || ny == 0 || nx == N - 1 || ny == N - 1) {
p.num /= 2;
// ๋ง์ฝ 1/2 ํ๋๋ฐ ์๋ฉธ๋ ๊ฒฝ์ฐ ๊ทธ๋ฅ ๋์๊ฐ๋ค. ๋ฐ์ ์ฒ๋ฆฌํ ํ์ x
if (p.num == 0) continue;
// ๋ฐฉํฅ ๋ฐ๋๋ก ํด -> ์ง์์ด๋ฉด --, ํ์์ด๋ฉด ++ 1 3 ์ ๋ฐฉํฅ๋ฐ๊ฟ๋ ค๋ฉด + / 2,4 ๋ ๋ฐฉํฅ๋ฐ๊ฟ๋ ค๋ฉด -
if (p.way % 2 == 1)
p.way++;
else
p.way--;
}
// ํด๋น ์๋ฆฌ์ ์ฒ์ ์ด๋ํ ๋ฏธ์๋ฌผ ๊ตฐ์ง์ด๋ฉด ๊ทธ์๋ฆฌ์ ์ธํ
if (map[ny][nx] == null) {
map[ny][nx] = p;
}
// ํด๋น ์๋ฆฌ์ ์ฒ์ ์ด๋ํ ๋ฏธ์๋ฌผ ๊ตฐ์ง์ด ์๋๋ฉด ๊ธฐ์กด ๊ตฐ์ง์ ํฉ์น๊ธฐ ( ๋ฌด์กฐ๊ฑด ์ ์ ๋ค์ด๊ฐ๊ฒ ๋ ํฌ๋ค ->
// PriorityQueueQueue๋ผ์
else {
map[ny][nx].num += p.num;
// System.out.println(ny + " , " + nx + "์ ๊ฐ์๋ "+ map[ny][nx].num);
}
}
// 1์๊ฐ ์ฒ๋ฆฌ
remainNum = reset();
time--;
}
return remainNum;
}
// ๋งค์๊ฐ๋ง๋ค ํ์ํ ์ ๋ฆฌ, ์ด๊ธฐํ ์์
static int reset() {
int total = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] != null) {
// ๋ค์ ํ์ ๋ฃ์ด์ฃผ๊ณ
pQueue.offer(map[i][j]);
// ์ด์์๋ ๋ฏธ์๋ฌผ ๊ตฐ์ง์ ํฌ๊ธฐ ๋์
total += map[i][j].num;
// map์ ๋ฆฌ์
์ํจ๋ค
// ๋ค์ ์๊ฐ์ ๋ฐ๋ณตํ๊ธฐ ์ํด
map[i][j] = null;
}
}
}
return total;
}
}
๐ค ๋์ ์๊ฐ
์๋ฎฌ๋ ์ด์
๋ฌธ์ ์ด๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ ๊ทธ ์ค์ ๋๋ ๋ฏธ์๋ฌผ๋ค์ ์งํฉ์ ๋ฐ๋ก ์ฐ์ ์์ ํ๋ก ๋นผ๊ณ ๋์ ๊ฒ ์๋๋ก ๋์๋ค.
๊ทธ๋ฆฌ๊ณ 1์๊ฐ ์ง๋ ๋๋ง๋ค map[][]์ ๋ฃ์ด์ ์์ง์ด๊ณ ํฉ์น๊ณ ๋ค์ map ์ด๊ธฐํ ์ํค๊ณ ์ฐ์ ์์ ํ์ ๋ฃ์ด์ฃผ์๋ค.
์ด ๋ฐฉ๋ฒ์ด ๊ทธ๋ฅ list๋ก ํ๋ ๊ฒ๋ณด๋ค ๋ฐฐ์ด ์
๋ ฅ ์ถ๋ ฅ์ด ๋ง๊ธด ํ์ง๋ง ํ๋ฆด ์ํ์ด ์๋ค๋ ์ ์์ ์์ฃผ ์ ์ฉํ๋ค.
- ๋ฏธ์๋ฌผ ์ ์ฅ (๋ณธ์ธ ๋ง์) -> ๋ ์ขํ, ์, ๋ฐฉํฅ์ผ๋ก 4๊ฐ์ง๋ ์์ด์ ํด๋์ค๋ก ์ ์ธํ์๋ค.
- ๋ฏธ์๋ฌผ ์ด๋ ( ๊ฐ์ฅ์๋ฆฌ์ด๋ฉด ๋ฐํ์ผ๋ก ๋๋๊ณ , ๋ฐฉํฅ ๋ฐ๋๋ก , ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๋ฏธ์๋ฌผ์ด ๊ฒน์น ์์๋ ์๋ฅผ ํฉ์น๊ณ ์๋ ์๊ฐ ๋ ์ปธ๋ ๋ฏธ์๋ฌผ์ ๋ฐฉํฅ์ ๊ฐ์ง๊ฒ ๋๋ค. )
- ๋งค์๊ฐ ๋ง๋ค ์ ๋ฆฌ ( ๋ฏธ์๋ฌผ๋ค์ ์ด ํฉ), ์ด๊ธฐํ ์ค๋ง๋ค ์ฃผ์์ ๋ฌ์๋์ ๊ฐ๋ ์ฑ์ด ์ข์ ๊ฒ์ด๋ค.