Post

[BOJ] 17822 - 원판 돌리기

[백준] 17822 - 원판 돌리기

골드문제인데 의외로 알고리즘은 전혀 들어가지 않았고 순수 구현문제다(사실 들어간건데 모르는 걸수도 있다.)
여담이지만 지난번에 %연산에 데인 것이 있어서 직접 mod함수를 만들어서 사용했다. 과연 이게 더 안전할것인지는 모르겠지만..

추가 기재사항

  1. mem시리즈 함수를 쓸때는 꼭.. string.h를 인클루드 해주자. 더이상의 컴파일에러는 그만..
  2. 원형 뭐시기 문제에서 항상 등장하는 시작과 끝을 연결하는 부분에서 살짝 실수가 있었다. 조심하도록 하자. 오타도 이제 그만..
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <map>
#include <queue>
#include <string.h>
#define MAX = 987654321
using namespace std;
typedef pair<int, int> PII;

const int dr[4] = { 0,0,1,-1 }, dc[4] = { 1,-1,0,0 };
int n, m, t, arr[55][55], x, d, k;

int mod(int a, int b) {
	if (a >= b) a -= b;
	if (a < 0) a += b;
	return a;
}

int main(void) {
	scanf("%d %d %d", &n, &m, &t);
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < m; j++) {
			scanf("%d", arr[i] + j);
		}
	}
	for (int i = 0; i < t; i++) {
		scanf("%d %d %d", &x, &d, &k);
		if (d) k *= -1;
		for (int j = 1; j * x <= n; j++) {
			int tmp[55] = { 0, };
			for (int z = 0; z < m; z++) {
				tmp[mod(z + k, m)] = arr[j * x][z];
			}
			memcpy(arr[j * x], tmp, 4 * m);
		}
		int sum = 0, cnt = 0;
		bool ck = true, e[55][55] = { 0, };
		for (int j = 1; j <= n; j++) {
			for (int z = 0; z < m; z++) {
				if (e[j][z] || arr[j][z] == 0) continue;
				for (int y = 0; y < 4; y++) {
					int r = j + dr[y], c = mod(z + dc[y], m);
					if (r > 0 && r <= n && arr[j][z] == arr[r][c]) {
						ck = false;
						e[r][c] = true;
						e[j][z] = true;
					}
				}
				if (!e[j][z] || arr[j][z] == 0) {
					sum += arr[j][z];
					cnt++;
				}
			}
		}
		if (ck) {
			if (cnt == 0) break;
			for (int j = 1; j <= n; j++) {
				for (int z = 0; z < m; z++) {
					if (e[j][z] || arr[j][z] == 0) continue;
					if (arr[j][z] * cnt > sum) {
						arr[j][z]--;
					}
					else if (arr[j][z] * cnt < sum) {
						arr[j][z]++;
					}
				}
			}
		}
		else {
			for (int j = 1; j <= n; j++) {
				for (int z = 0; z < m; z++) {
					if (e[j][z]) arr[j][z] = 0;
				}
			}
		}
	}
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < m; j++) {
			sum += arr[i][j];
		}
	}
	printf("%d", sum);
	return 0;
}
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.