3 ๋ถ„ ์†Œ์š”

๐Ÿ“ [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๋กœ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐฐ์—ด ์ž…๋ ฅ ์ถœ๋ ฅ์ด ๋งŽ๊ธด ํ•˜์ง€๋งŒ ํ‹€๋ฆด ์œ„ํ—˜์ด ์—†๋‹ค๋Š” ์ ์—์„œ ์•„์ฃผ ์œ ์šฉํ•˜๋‹ค.

  1. ๋ฏธ์ƒ๋ฌผ ์ €์žฅ (๋ณธ์ธ ๋งˆ์Œ) -> ๋‹Œ ์ขŒํ‘œ, ์ˆ˜, ๋ฐฉํ–ฅ์œผ๋กœ 4๊ฐ€์ง€๋‚˜ ์žˆ์–ด์„œ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.
  2. ๋ฏธ์ƒ๋ฌผ ์ด๋™ ( ๊ฐ€์žฅ์ž๋ฆฌ์ด๋ฉด ๋ฐ˜ํ‹ˆ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๋ฐฉํ–ฅ ๋ฐ˜๋Œ€๋กœ , ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๋ฏธ์ƒ๋ฌผ์ด ๊ฒน์น  ์‹œ์—๋Š” ์ˆ˜๋ฅผ ํ•ฉ์น˜๊ณ  ์›๋ž˜ ์ˆ˜๊ฐ€ ๋” ์ปธ๋Š” ๋ฏธ์ƒ๋ฌผ์˜ ๋ฐฉํ–ฅ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. )
  3. ๋งค์‹œ๊ฐ„ ๋งˆ๋‹ค ์ •๋ฆฌ ( ๋ฏธ์ƒ๋ฌผ๋“ค์˜ ์ด ํ•ฉ), ์ดˆ๊ธฐํ™” ์ค„๋งˆ๋‹ค ์ฃผ์„์„ ๋‹ฌ์•„๋†”์„œ ๊ฐ€๋…์„ฑ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.