BOJ_G3_17822
๐ [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๋งํผ ๋ฐ๋ณตํ๊ณ ๋ง์ง๋ง์ ๋จ์ ๊ฐ๋ค์ ๋ชจ๋ ๋ํด ๋ํ๋ด ์ค๋ค.