5 ๋ถ„ ์†Œ์š”

๐Ÿ“ [G3_17822] ์›ํŒ ๋Œ๋ฆฌ๊ธฐ

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 Main {

	static class Node {
		int x;
		int y;

		public Node(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}
	}

	static int[][] map;
	static int N, M, T;
	static int[] dx = { 0, 0, 1, -1 };
	static int[] dy = { 1, -1, 0, 0 };
	static boolean[][] v;
	static Queue<Node> q;
	static ArrayList<Node> list;

	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());
		T = Integer.parseInt(st.nextToken());

		// ์›๋ฐ˜ ์ขŒํ‘œ๋“ค
		map = new int[N + 1][M + 1];

		// ์ขŒํ‘œ ์ž…๋ ฅ
		for (int i = 1; i < N + 1; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 1; j < M + 1; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		// ํšŒ์ „
		for (int i = 0; i < T; i++) {
			st = new StringTokenizer(br.readLine(), " ");

			int x = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());
			int k = Integer.parseInt(st.nextToken());

			// ํšŒ์ „ ์‹œํ‚ค๊ธฐ
			rotate(x, d, k);

			// ์ธ์ ‘ํ•œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์ฒดํฌ
			boolean check = find();
			// ์ธ์ ‘ํ•œ ๊ฒƒ์ด ์—†๋‹ค๋ฉด
			if (!check) {
				// ํ‰๊ท ๊ณ„์‚ฐ
				calAvg();
			}
		}

		// ์ถœ๋ ฅ
		int sum = 0;
		for (int i = 1; i < N + 1; i++) {
			for (int j = 1; j < M + 1; j++) {
					sum += map[i][j];
			}
		}

		System.out.println(sum);

	} // main end

	static void calAvg() {
		double sum = 0;
		double cnt = 0;

		// ํ‰๊ท  ๊ตฌํ•˜๊ธฐ
		for (int i = 1; i < N + 1; i++) {
			for (int j = 1; j < M + 1; j++) {
				// ๊ฐ’์ด ์žˆ์œผ๋ฉด
				if (map[i][j] > 0) {
					sum += map[i][j];
					cnt++;
				}
			}
		}

		// ๋งŒ์•ฝ ๊ฐ’์ด ์—†๋‹ค๋ฉด ํ†ต๊ณผ
		if (cnt == 0)
			return;

		double avg = sum / cnt;

		// ํ‰๊ท ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋”ํ•˜๊ธฐ, ๋นผ๊ธฐ ์‹คํ–‰
		for (int i = 1; i < N + 1; i++) {
			for (int j = 1; j < M + 1; j++) {
				// ์•„๋ฌด๊ฒƒ๋„ ์—†์œผ๋ฉด ํ†ต๊ณผ
				if (map[i][j] == 0)
					continue;
				// ํ‰๊ท ๋ณด๋‹ค ํฌ๋ฉด 1 ๋นผ๊ธฐ
				if (map[i][j] > avg)
					map[i][j] -= 1;
				// ํ‰๊ท ๋ณด๋‹ค ์ž‘์œผ๋ฉด 1 ๋”ํ•˜๊ธฐ
				else if (map[i][j] < avg)
					map[i][j] += 1;
			}
		}
	}

	// ๊ฐ™์€ ๋ฒˆํ˜ธ์ธ์ง€ ์ฐพ๊ธฐ
	static boolean find() {
		// ์ธ์ ‘ํ•œ ๊ฒƒ ์ค‘ ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์ฒดํฌ -> ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false
		boolean flag = false;
		// ์ธ์ ‘ํ•œ์ง€ ์ฒดํฌ ๋ฐฐ์—ด
		v = new boolean[N + 1][M + 1];
		// ํ ์ƒ์„ฑ
		q = new LinkedList<Node>();
		// ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ - ์ธ์ ‘ํ•œ ์ˆ˜๋“ค์ด ๋ช‡๊ฐœ ์žˆ๋Š”์ง€ ์ฒดํฌ
		list = new ArrayList<Node>();

		// ๋ชจ๋“  ์ขŒํ‘œ BFS ํƒ์ƒ‰
		for (int i = 1; i < N + 1; i++) {
			for (int j = 1; j < M + 1; j++) {
				// ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜ ์ œ๊ฑฐํ–ˆ์œผ๋ฉด ํ†ต๊ณผ
				if (v[i][j] || map[i][j] == 0)
					continue;
				Node cur = new Node(j, i);
				// ํ, ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€
				q.add(cur);
				list.add(cur);

				// BFS
				bfs(map[i][j]);

				// list์— 2๊ฐœ ์ด์ƒ ์žˆ๋‹ค๋ฉด -> ์‚ญ์ œํ•ด์ฃผ๊ธฐ
				if (list.size() > 1) {
					// ๋ณ€๊ฒฝ๋๋‹ค๋Š” ์˜๋ฏธ
					flag = true;
					// ์›ํŒ์—์„œ ์ˆซ์ž ์ œ๊ฑฐ
					for (Node node : list) {
						map[node.y][node.x] = 0;
					}
				}
				// ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
				list.clear();
			}
		}
		// ์ธ์ ‘ํ•œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ์œ ๋ฌด ๋ฐ˜ํ™˜
		return flag;
	}

	// 4๋ฐฉํ–ฅ ํƒ์ƒ‰
	static void bfs(int point) {
		while (!q.isEmpty()) {
			Node cur = q.poll();

			int nx, ny;
			for (int i = 0; i < 4; i++) {
				nx = cur.x + dx[i];
				ny = cur.y + dy[i];


				// X ๋Š” ๋‹ค ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
				if (nx < 1)
					nx = M;
				else if (nx > M)
					nx = 1;

				// Y - ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์ด๋ฉด ํ†ต๊ณผ
				if (ny < 1 || ny > N || v[ny][nx])
					continue;

				// ๋งŒ์•ฝ ์ธ์ ‘ํ•œ ์ขŒํ‘œ์˜ ์ˆซ์ž๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ
				if (map[ny][nx] == point) {
					// ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
					v[ny][nx] = true;
					Node node = new Node(nx, ny);
					// queue ์— ์‚ฝ์ž…
					q.add(node);
					// ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…
					list.add(node);
				}
			}
		}
	}

	// ํšŒ์ „์‹œํ‚ค๊ธฐ
	static void rotate(int x, int d, int k) {
		// k๋ฒˆ ํšŒ์ „์‹œํ‚ค๊ธฐ
		while (k > 0) {
			for (int i = 1; i < N + 1; i++) {
				// x์˜ ๋ฐฐ์ˆ˜์ด๋ฉด ํšŒ์ „
				if (i % x == 0) {
					// ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ
					if (d == 0) {
						// ๋งˆ์ง€๋ง‰ ๊ฐ’
						int last = map[i][M];
						for (int j = M; j > 0; j--) {
							map[i][j] = map[i][j - 1];
						}
						map[i][1] = last;
					}
					// ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ
					else {
						// ์ฒ˜์Œ ๊ฐ’
						int first = map[i][1];
						for (int j = 1; j < M; j++) {
							map[i][j] = map[i][j + 1];
						}
						map[i][M] = first;
					}
				}
			}
			k--;
		}
	}
} // class end

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

ํ™•์‹คํžˆ ๋‚œ์ด๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋‹ˆ ๋ฌธ์ œ์— ์กฐ๊ฑด๋„ ๋งŽ๊ณ  ๋ฌธ์ œ ์ž์ฒด๋ฅผ ์ดํ•ดํ•˜๊ธฐ๋„ ๊ทธ๋ ‡๊ฒŒ ์‰ฝ์ง€๋Š” ์•Š์•˜๋‹ค.
์‚ฌ์‹ค ์‹œ๊ฐ„๋‚ด์—๋Š” ํ’€์ง€ ๋ชปํ–ˆ๋Š”๋ฐ ๊ธฐ์กด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ดํ•ด๋„ ํ‹€๋ ธ์—ˆ๋‹ค. ํ‰๊ท ๊ณ„์‚ฐ์„ ๋งจ ๋งˆ์ง€๋ง‰์— ํ•œ ๋ฒˆ๋งŒ ํ•ด์ฃผ๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ .. ใ… 
๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ํ‘ผ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
ํฐ ํ‹€๋กœ๋Š” rotate ๋ฉ”์„œ๋“œ๋กœ ์ขŒํ‘œ ์ด๋™, find ๋ฉ”์„œ๋“œ๋กœ ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ bfs ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์•ˆ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ฐ˜ํ™˜, calAvg ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ’์ด ์•ˆ ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ํ‰๊ท  ๊ณ„์‚ฐ์„ ํ•ด์ค€๋‹ค.
์‚ฌ์‹ค bfs๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์ง€๋งŒ ์‹œ๊ฐ„์ ์ธ ๋ถ€๋ถ„์—์„œ ํ™•์‹คํžˆ ๋‹จ์ถ•์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์‚ฌ์šฉํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  queue๋Š” bfs ํƒ์ƒ‰์„ ์œ„ํ•ด ์‚ฌ์šฉ, 2์ฐจ์› ๋ฐฐ์—ด map์€ ์ „์ฒด ์ขŒํ‘œ๋ฅผ ์ €์žฅ, list๋Š” ์ธ์ ‘ํ•ด ์žˆ๋Š” ๊ฐ’๋“ค์„ ์ €์žฅํ•ด ๋‚˜์ค‘์— ๊ฐ’์„ ์—†์• ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋จ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
์ „์ฒด ์ˆœ์„œ ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด ๋ณด๊ฒ ๋‹ค.

  • ๋จผ์ € ๊ฐ’๋“ค์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ( map, x, d, k ๋“ฑ)
  • ๋‹ค์Œ์œผ๋กœ x,d,k๋ฅผ ์ด์šฉํ•ด์„œ rotate ์ขŒํ‘œ๋“ค์„ ์ด๋™์‹œํ‚จ๋‹ค. ( ์‹œ๊ณ„๋ฐฉํ–ฅ, ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ )
    • ์‹œ๊ณ„๋ฐฉํ–ฅ์€ ๋งจ ๋’ค์— ๊ฐ’์„ ๋นผ๋†“๊ณ  ํ•œ ์นธ์”ฉ ์ด๋™ ํ‚ค์‹œ๊ณ  ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์€ ๋งจ ์•ž์— ๊ฐ’์„ ๋นผ๋†“๊ณ  ํ•œ ์นธ์”ฉ ์ด๋™์‹œ์ผฐ๋‹ค.
  • ๋‹ค์Œ์€ ๋ชจ๋“  ์ขŒํ‘œ์—์„œ bfs ํƒ์ƒ‰์„ ํ•ด ์ธ์ ‘ํ•œ ๊ฐ’๋“ค์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด ์ค€๋‹ค.
  • ๋งŒ์•ฝ ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’๋“ค์„ list์— ์ €์žฅ์‹œ์ผœ list์— ์žˆ๋Š” ๊ฐ’๋“ค์„ 0์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. ( ์‚ญ์ œ ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ )
  • ๋‹ค ํƒ์ƒ‰ํ•˜๊ณ  ๋‚˜์„œ flag ( ์ธ์ ‘ํ•œ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ‘œ์‹œํ•ด์ฃผ๋Š” boolean ๊ฐ’ ) ๊ฐ’์„ ํ†ตํ•ด ๋งŒ์•ฝ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๊ฒŒ ์—†๋‹ค๋ฉด ํ‰๊ท ๊ฐ’์„ ๊ตฌํ•ด์ฃผ๊ณ  ํ‰๊ท ๋ณด๋‹ค ์ž‘์œผ๋ฉด 1์„ ๋”ํ•˜๊ณ  ํ‰๊ท ๋ณด๋‹ค ํฌ๋ฉด 1์„ ๋นผ์ฃผ๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.
  • ์ด ๊ณผ์ •์„ t๋งŒํผ ๋ฐ˜๋ณตํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ๋‚จ์€ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ๋”ํ•ด ๋‚˜ํƒ€๋‚ด ์ค€๋‹ค.

ํƒœ๊ทธ: , , ,

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

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