03
17

 

 

https://www.acmicpc.net/problem/17822

 

17822๋ฒˆ: ์›ํŒ ๋Œ๋ฆฌ๊ธฐ

๋ฐ˜์ง€๋ฆ„์ด 1, 2, ..., N์ธ ์›ํŒ์ด ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง€๋Š” ์ˆœ์œผ๋กœ ๋ฐ”๋‹ฅ์— ๋†“์—ฌ์žˆ๊ณ , ์›ํŒ์˜ ์ค‘์‹ฌ์€ ๋ชจ๋‘ ๊ฐ™๋‹ค. ์›ํŒ์˜ ๋ฐ˜์ง€๋ฆ„์ด i์ด๋ฉด, ๊ทธ ์›ํŒ์„ i๋ฒˆ์งธ ์›ํŒ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์›ํŒ์—๋Š” M๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ ํ˜€

www.acmicpc.net

 

๋‹ค ๋งž์•˜๋Š”๋ฐ ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์ฝ์ง€ ์•Š์•„์„œ ํ‹€๋ ธ๋‹ค.

์ธ์ ‘ํ•˜์ง€์•Š์•„์„œ ํ‰๊ท  ๊ฐ’๋ณด๋‹ค +1, -1 ํ•ด์ค€๋’ค ์ด๊ฒŒ ๋งˆ์ง€๋ง‰ ์ˆ˜ํ–‰์ด์—ˆ์œผ๋ฉด ๊ทธ ์ƒํƒœ๋กœ ์ดํ•ฉ์„ ์ถœ๋ ฅํ•ด์•ผ๋œ๋‹ค.


์ •๋‹ต์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class Main {

	static int n;
	static int m;
	static int[][] circle;
	static int cnt;

	/**
	 * ๋งจ ๋’ค ๋นผ์„œ ๋งจ ์•ž์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ํ•˜๋‚˜์”ฉ ๋‹ค ๋ฐ€๋ฉด ์‹œ๊ณ„๋ฐฉํ–ฅ ํšŒ์ „
	 * 
	 * @param arr
	 */
	public static void clock(int[] arr) {
		int tmp = arr[m - 1];
		for (int i = m - 1; i > 0; i--) {
			arr[i] = arr[i - 1];
		}
		arr[0] = tmp;
	}

	/*
	 * ๋ฐ˜์‹œ๊ณ„
	 * 
	 * @param arr
	 */
	public static void counterClock(int[] arr) {
		int tmp = arr[0];
		for (int i = 0; i < m - 1; i++) {
			arr[i] = arr[i + 1];
		}
		arr[m - 1] = tmp;
	}

	public static void roll(int di, int xi, int ki) {
		if (di == 0) {
			// ์‹œ๊ณ„๋ฐฉํ–ฅ xi๋ฐฐ์ˆ˜์ธ ์›ํŒ์„ ki์นธ ํšŒ์ „
			for (int j = 0; j < n; j++) {
				// j+1๋ฒˆ์งธ๊ฐ€ x๋ฐฐ์ˆ˜๋ƒ?
				if ((j + 1) % xi == 0) {
					for (int k = 0; k < ki; k++) {
						clock(circle[j]);
					}
				}
			}
		} else {
			// ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ
			for (int j = 0; j < n; j++) {
				// j+1๋ฒˆ์งธ๊ฐ€ x๋ฐฐ์ˆ˜๋ƒ?
				if ((j + 1) % xi == 0) {
					for (int k = 0; k < ki; k++) {
						counterClock(circle[j]);
					}
				}
			}
		}
	}

	/**
	 * column ์ญ‰ ๋Œ๋ฉด์„œ ์ธ์ ‘ํ•œ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด ๋‘˜๋‹ค ์—†์• ๊ธฐ
	 */
	public static boolean check() {
		int[][] adj = new int[n][m]; // 1๋กœ ํ‘œ์‹œํ•˜๊ณ , ๋‚˜์ค‘์— 1์ธ๊ฑฐ ์‹น๋‹ค 0์œผ๋กœ ๋ฐ€๊ธฐ
		boolean find = false;
		for (int j = 0; j < m; j++) {
			for (int i = 0; i < n - 1; i++) {
				// ๊ฐ™์€ ์›ํŒ์—์„œ ์ธ์ ‘ํ•˜๋Š” ๊ฒƒ๋„ ํฌํ•จ...
				if (circle[i][j] != 1001 && circle[i][j] == circle[i + 1][j]) {
					adj[i][j] = 1;
					adj[i + 1][j] = 1;
				}
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (circle[i][j] != 1001 && j < m - 1 && circle[i][j] == circle[i][j + 1]) {
					adj[i][j] = 1;
					adj[i][j + 1] = 1;
				}
				if (j == m - 1) {
					if (circle[i][j] != 1001 && circle[i][j] == circle[i][0]) {
						adj[i][j] = 1;
						adj[i][0] = 1;
					}
				}
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (adj[i][j] == 1) {
					circle[i][j] = 1001;
					find = true;
				}
			}
		}
		return find;
	}

	public static int sum() {
		cnt = 0;
		int res = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (circle[i][j] != 1001) {
					cnt++;
					res += circle[i][j];
				}
			}
		}
		return res;
	}

	/**
	 * ์›ํŒ ์ ํžŒ ์ˆ˜ ํ‰๊ท  ๊ตฌํ•ด์„œ ํ‰๊ท ๋ณด๋‹ค ํฐ์ˆ˜์—์„œ 1๋นผ๊ณ , ์ž‘์€์ˆ˜์— 1๋”ํ•จ
	 * 
	 * @param avg
	 */
	public static void process(double avg) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (circle[i][j] != 1001 && circle[i][j] > avg) {
					circle[i][j]--;
				} else if (circle[i][j] != 1001 && circle[i][j] < avg) {
					circle[i][j]++;
				}
			}
		}
	}

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		int t = Integer.parseInt(st.nextToken());
		int result = 0;
		circle = new int[n][m];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < m; j++) {
				circle[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		int[][] xdk = new int[t][3]; // i๋ฒˆ์งธ์˜ x, d, k
		for (int i = 0; i < t; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < 3; j++) {
				xdk[i][j] = Integer.parseInt(st.nextToken()); // x, d, k ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์˜ด
			}
			int xi = xdk[i][0];
			int di = xdk[i][1];
			int ki = xdk[i][2];
			roll(di, xi, ki);
			boolean isAdj = check();
			double res = sum();

			if (!isAdj) {
				// ์›ํŒ ์ ํžŒ ์ˆ˜ ํ‰๊ท  ๊ตฌํ•ด์„œ ํ‰๊ท ๋ณด๋‹ค ํฐ์ˆ˜์—์„œ 1๋นผ๊ณ , ์ž‘์€์ˆ˜์— 1๋”ํ•จ
				double avg = res / cnt;
				process(avg);
				result = (int) sum();
			}else {
				result = (int) res;
			}
		}
		System.out.println(result);
	}
}

 

๋ฐฉํ–ฅ ๋ฐฐ์—ด ๋”ฐ๋กœ ์—†์ด ์ฒœ์ฒœํžˆ ๊ตฌํ˜„์œผ๋กœ ํ’€์—ˆ๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT