코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring> // memset, memcpy 포함
using namespace std;
int n, m, l, r, s, c, a[53][53], res = 987654321, b[53][53];
vector<vector<int>> v;
void go() {
memcpy(b, a, sizeof(a)); // b 배열에 a배열을 복사
int temp[53][53]; // 임시 배열
for(int i = 0; i < v.size(); i++) {
memset(temp, 0, sizeof(temp)); // 초기화
int rr = v[i][0];
int cc = v[i][1];
int ss = v[i][2];
// 배열돌리기는 ss층에 거쳐 반복
for(int j = 0; j < ss; j++) {
int left = cc - ss + j - 1;
int top = rr - ss + j - 1;
int right = cc + ss - j - 1;
int bot = rr+ ss - j - 1;
// 상단 회전
for(int k = left; k < right; k++) temp[top][k+1] = a[top][k];
// 우측 회전
for(int k = top; k < bot; k++) temp[k+1][right] = a[k][right];
// 하단 회전
for(int k = right; k > left; k--) temp[bot][k-1] = a[bot][k];
// 좌측 회전
for(int k = bot; k > top; k--) temp[k-1][left] = a[k][left];
}
for(int j = 0; j < n; j++) {
for(int k = 0; k < m; k++) {
// temp 배열에 값이 있으면 변경
if(temp[j][k]) a[j][k] = temp[j][k];
}
}
}
for(int i = 0; i < n; i++) {
int cnt = 0;
for(int j = 0; j < m; j++) {
cnt += a[i][j];
}
res = min(res, cnt);
}
// 다음 케이스 확인을 위해 a배열 원상복구
memcpy(a,b,sizeof(b));
}
void FASTIO() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
int main() {
FASTIO();
cin >> n >> m >> l;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
for (int i = 0; i < l; i++) {
cin >> r >> c >> s;
v.push_back({r, c, s});
}
// next_permution을 사용하기 위해 오름차순 정렬
sort(v.begin(), v.end());
do {
go();
} while (next_permutation(v.begin(), v.end()));
cout << res << '\n';
return 0;
}
층에 맞게 시계 방향으로 배열을 회전 시켜주면 되는 문제. 회전 연산의 모든 케이스를 확인하기 위해 순열을 사용했다. 중간에 반복문 연산자가 엇갈리고, 변수명이 엉켜 헤맨 문제. 직관적으로 이해할 수 있도록 변수명을 작성하는 연습을 해야겠다.
'백준' 카테고리의 다른 글
[백준] 11053번 가장 긴 증가하는 부분 수열 C++ 코드 (0) | 2024.07.08 |
---|---|
[백준] 3079번 입국심사 C++ 코드 (0) | 2024.07.02 |
[백준] 14888번 연산자 끼워넣기 C++ 코드 (1) | 2024.06.14 |
[백준] 17822번 원판 돌리기 C++ 코드 (1) | 2024.06.03 |
[백준] 1202번 보석 도둑 C++ 코드 (0) | 2024.05.29 |