4 ๋ถ„ ์†Œ์š”

๐Ÿ“ [G4_20056] ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_G4_20056 {
	static class ball {
		int y;
		int x;
		int ballM;
		int ballS;
		int ballD;

		// ์ขŒํ‘œ y,x, ์งˆ๋Ÿ‰, ์†๋ ฅ, ๋ฐฉํ–ฅ
		public ball(int y, int x, int ballM, int ballS, int ballD) {
			this.y = y;
			this.x = x;
			this.ballM = ballM;
			this.ballS = ballS;
			this.ballD = ballD;
		}
	}

	static int N, M, K, r, c, m, s, d;
	// 8๋ฐฉํ–ฅ 0,1,2,3,4,5,6,7
	static int[] dx = { 0, 1, 1, 1, 0, -1, -1, -1 };
	static int[] dy = { -1, -1, 0, 1, 1, 1, 0, -1 };
	static Queue<ball> queue;
	static ArrayList<ball>[][] map;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		// **** input start ****
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());

		// ball ์ €์žฅ ํ
		queue = new LinkedList<ball>();
		// ์ขŒํ‘œ๋งˆ๋‹ค ball ์ €์žฅ ๋ฆฌ์ŠคํŠธ
		map = new ArrayList[N][N];

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				map[i][j] = new ArrayList<>();
			}
		}

		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			// ์ขŒํ‘œ
			r = Integer.parseInt(st.nextToken())-1;
			c = Integer.parseInt(st.nextToken())-1;
			// ์งˆ๋Ÿ‰
			m = Integer.parseInt(st.nextToken());
			// ์†๋ ฅ
			s = Integer.parseInt(st.nextToken());
			// ๋ฐฉํ–ฅ
			d = Integer.parseInt(st.nextToken());

			// queue ์— ์ €์žฅ
			queue.add(new ball(r, c, m, s, d));
		}
		// **** input end ****

		// K๋ฒˆ ๋ฐ˜๋ณต
		while (K > 0) {
			int size = queue.size();
			for (int i = 0; i < size; i++) {
				// ์ขŒํ‘œ ์ด๋™ํ•˜๊ธฐ
				move();
			}
			// ์ „์ฒด ๋Œ๋ฉด์„œ ๊ฒน์นœ ๊ฒƒ์ด ์žˆ๋‚˜ ์—†๋‚˜ ์ฒดํฌ
			for (int j = 0; j < N; j++) {
				for (int z = 0; z < N; z++) {
					// ์—†์œผ๋ฉด ํ†ต๊ณผ
					if (map[j][z].size() == 0)
						continue;
					// 1๊ฐœ ์žˆ์œผ๋ฉด ๊ทธ๋ƒฅ ํ์— ๋„ฃ๋Š”๋‹ค
					if (map[j][z].size() == 1) {
						queue.add(map[j][z].get(0));
						continue;
					}
					// 2๊ฐœ ์ด์ƒ์ธ ๊ฒƒ์ด ์žˆ์œผ๋ฉด
					else {
						int weight = 0;
						int speed = 0;
						ArrayList<Integer> list = new ArrayList<>();
						for (int i = 0; i < map[j][z].size(); i++) {
							weight += map[j][z].get(i).ballM;
							speed += map[j][z].get(i).ballS;
							list.add(map[j][z].get(i).ballD);
						}

						weight = weight(weight);
						speed = speed(speed, map[j][z].size());
						int check = check(list);

						// ์งˆ๋Ÿ‰์ด 0 ์ด๋ฉด ์—†์• ๊ธฐ
						if (weight == 0)
							continue;
						// ๋‹ค ๊ฐ™์œผ๋ฉด ์ง์ˆ˜
						if (check == 1) {
							int idx = 0;
							for (int i = 0; i < 4; i++) {
								queue.add(new ball(j, z, weight, speed, idx));
								idx += 2;
							}
						}
						// ๋‹ค๋ฅด๋ฉด ํ™€์ˆ˜
						else {
							int idx = 1;
							for (int i = 0; i < 4; i++) {
								queue.add(new ball(j, z, weight, speed, idx));
								idx += 2;
							}
						}
					}
				}
			}
			// map ์ดˆ๊ธฐํ™”
			for(int i=0;i<N;i++) {
				for(int j=0;j<N;j++) {
					map[i][j] = new ArrayList<>();
				}
			}
			K--;
		}

		int res = 0;
		int size = queue.size();
		for(int i=0; i<size; i++) {
			res += queue.poll().ballM;
		}

		System.out.println(res);

	}// main end

	// ์ด๋™ํ•˜๋Š” ๋ฉ”์„œ๋“œ
	static void move() {
		// ์ด๋™ํ•  ball
		ball cur = queue.poll();

		// ์ด๋™
		int ny = cur.y + dy[cur.ballD]*(cur.ballS%N);
		int nx = cur.x + dx[cur.ballD]*(cur.ballS%N);

		ny = (ny + N)%N;
		nx = (nx + N)%N;

		// list ์— ์ถ”๊ฐ€
		map[ny][nx].add(new ball(ny, nx, cur.ballM, cur.ballS, cur.ballD));
	}

	// ์งˆ๋Ÿ‰ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
	static int weight(int sum) {
		return sum / 5;
	}

	// ์†๋ ฅ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
	static int speed(int sum, int cnt) {
		return sum / cnt;
	}

	// ๋ฐฉํ–ฅ ์ฒดํฌ - ๋ฐฉํ–ฅ๋“ค ๋ชจ๋‘ ๋ชจ์•„์„œ ( ๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ ธ์™€์„œ 1-> ๋‹ค๊ฐ™๋‹ค , ์ง์ˆ˜ / 2-> ๋‹ค ์•ˆ๊ฐ™๋‹ค, ํ™€์ˆ˜๋กœ ๋ฐ˜ํ™˜ )
	static int check(ArrayList<Integer> list) {
		int num = 0;
		boolean flag = true;

		int temp = list.get(0) % 2;

		for (int i = 1; i < list.size(); i++) {
			// ๋งŒ์•ฝ ๋ชจ๋‘ ๊ฐ™์€ ํ™€์ˆ˜๋‚˜ ์ง์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ false
			if (list.get(i) % 2 != temp)
				flag = false;
		}

		// ๋งŒ์•ฝ ๋‹ค ๊ฐ™์œผ๋ฉด 1, ๋‹ค ๋‹ค๋ฅด๋ฉด 2
		if (flag)
			num = 1;
		else
			num = 2;

		return num;
	}
}// class end

๐Ÿค” ๋‚˜์˜ ์ƒ๊ฐ

์‚ผ์„ฑ SW ์—ญ๋Ÿ‰ ํ…Œ์ŠคํŠธ ๊ธฐ์ถœ ๋ฌธ์ œ ์ด๋‹คโ€ฆ ๋ฌธ์ œ๋‹ต๋‹คโ€ฆ ํ™•์‹คํžˆ ์กฐ๊ฑด๋„ ๋งŽ๊ณ  ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ธ๋ฐ ๋ณต์žกํ•˜๋‹ค ใ…‹ใ…‹
์Šคํ„ฐ๋””์—์„œ ํ’€์—ˆ๋Š”๋ฐ ๊ฒฐ๊ตญ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ฐพ์•„๋ดค๋‹ค. ๋‹คํ–‰ํžˆ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋น„์Šทํ•ด์„œ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋‚˜๋Š” ํŒŒ์ด์–ด๋ณผ๋“ค์„ ์ƒˆ๋กœ์šด queue์—๋‹ค๊ฐ€ ์ €์žฅํ•˜๋‹ˆ ๊ธฐ์กด queue์™€ ๊ทธ ์ขŒํ‘œ์˜ queue์™€ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ํ•ด์„œ ๊ตฌํ˜„์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ž˜์„œ ์ขŒํ‘œ๋งˆ๋‹ค ArrayList๋ฅผ ํ†ตํ•ด ball์„ ์ €์žฅํ•œ๋‹ค.
์ „์ฒด์ ์ธ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

  • ๋จผ์ € ๋ชจ๋“  ์ขŒํ‘œ๋งˆ๋‹ค ArrayList๋ฅผ ์ƒ์„ฑํ•ด ๋‘”๋‹ค.
  • ๊ฐ’๋“ค์„ ์ž…๋ ฅ๋ฐ›์•„ queue์— ์ €์žฅํ•œ๋‹ค. ( ์ดˆ๊ธฐ ํŒŒ์ด์–ด๋ณผ )
  • ํŒŒ์ด์–ด๋ณผ์„ ์ด๋™์‹œํ‚จ๋‹ค.
  • ์ด๋™์‹œํ‚ฌ ๋•Œ ์ขŒํ‘œ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ๊ณ„์‚ฐ์„ ํ•ด์ค€๋‹ค.
  • ์ด๋™์‹œํ‚จ ๊ฐ’๋“ค์„ ArrayList์— ์ €์žฅํ•œ๋‹ค.
  • ์ „์ฒด ์ขŒํ‘œ๋ฅผ ๋Œ๋ฉด์„œ ArrayList.size()๋ฅผ ํ™•์ธํ•˜๋ฉฐ 2๊ฐœ ์ด์ƒ์ธ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค.
  • ์žˆ์œผ๋ฉด ๋ฌธ์ œ์— ๋‚˜์™€์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๊ณ„์‚ฐ์„ ํ•ด์ค€๋‹ค.
    • ์งˆ๋Ÿ‰์€ ์ „์ฒด์งˆ๋Ÿ‰ํ•ฉ / 5 ( ์งˆ๋Ÿ‰์ด 0 ์ด๋ฉด ์—†์• ๊ธฐ )
    • ์†๋ ฅ์€ ์ „์ฒด์†๋ ฅํ•ฉ / ํŒŒ์ด์–ด๋ณผ ๊ฐœ์ˆ˜
    • ๋ฐฉํ–ฅ์€ ๊ณตํ†ต๋œ ๋ฐฉํ–ฅ์ด๋ฉด ์ง์ˆ˜, ์•„๋‹ˆ๋ฉด ํ™€์ˆ˜
  • ๊ณ„์‚ฐํ•ด์ค€ ํ›„์— queue์— ๋„ฃ์–ด์ฃผ๊ณ  ArrayList๋Š” ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€๋‹ค.
  • ์ด ๊ณผ์ •์„ K๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์ „์ฒด queue๋ฅผ ๋Œ๋ฉด์„œ ์งˆ๋Ÿ‰ํ•ฉ์„ ๊ตฌํ•ด์ค€๋‹ค.

ํƒœ๊ทธ: , , ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: