5-O
474
59 asked
http://boj.kr/a56d875c729140559ebb3e3fadf75479
게시판, 문제 제공 테케 전부 돌려보고 제가 직접 생각해서
큰돌님께 배운대로
최소, 최대 이런 것들을 나름고려해서 테케를 짜서 돌려봤는데도 이상이 없어보였는데 1%에서 틀립니다... 혼자 최대한 해결해보려 했는데 한 문제를 2일 동안 붙잡으니 진도가 안나가서요...
질문이 많아 죄송합니다...ㅠㅠ
Answer 2
0
안녕하세요 자르트님 ㅎㅎ
제가 이 코드 사실 여러번 디버깅을 해봤는데요..
잘 모르겠습니다..
잘 돌려지고 min_y, max_y 하신것도 괜찮습니다.
다만 걸리는 것은 ret을 해당 테스트케이스마다 최솟값으로 하는게 맞아서.
1 경우의 수 중 min > 1a
2 경우의 수 중 min > 2a
...
min(1a, 2a..) 를 출력하는 문제라 이 코드가 옳긴 옳은데요. (ret, ret2 분리)
#include<bits/stdc++.h>
using namespace std;
struct triple {
int r, c, s;
};
int min_y;
int max_y;
int min_x;
int max_x;
int dir;
int n, m, k, ret = 987654321, ret2 = 987654321;
vector<triple> v;
vector<int> idx;
int a[54][54];
int origin[54][54];
// 위 오른쪽 아래 왼쪽
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
vector<pair<int, int>> vv;
void print(int arr[54][54]) {
cout << '\n';
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << arr[i][j] << ' ';
}
cout << '\n';
}
}
void go(int y, int x) {
if (x == max_x && y == min_y)dir++;
if (x == min_x && y == max_y)dir++;
if (x == max_x && y == max_y)dir++;
int ny = y + dy[dir];
int nx = x + dx[dir];
if (!(min_y <= ny && ny <= max_y && min_x <= nx && nx <= max_x))return;
vv.push_back({ ny,nx });
go(ny, nx);
}
void _rotate() {
while (min_y != max_y) {
int startY = min_y;
int startX = min_x;
dir = 0;
vv.push_back({ startY,startX });
go(startY, startX);
vv.pop_back();
vector<int> b;
for (pair<int, int>p : vv)b.push_back(a[p.first][p.second]);
rotate(b.rbegin(), b.rbegin() + 1, b.rend());
int cnt = 0;
for (pair<int, int>p : vv)a[p.first][p.second] = b[cnt++];
vv.clear();
min_x++; max_x--; min_y++; max_y--;
}
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = 0; j < m; j++) {
sum += a[i][j];
}
ret = min(ret, sum);
}
}
int main() {
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)cin >> a[i][j];
}
memcpy(origin, a, sizeof(origin));
for (int i = 0; i < k; i++) {
triple t; cin >> t.r >> t.c >> t.s;
idx.push_back(i);
v.push_back(t);
}
do {
ret = 987654321;
for (int i = 0; i < v.size(); i++) {
min_y = v[idx[i]].r - v[idx[i]].s - 1;
max_y = v[idx[i]].r + v[idx[i]].s - 1;
min_x = v[idx[i]].c - v[idx[i]].s - 1;
max_x = v[idx[i]].c + v[idx[i]].s - 1;
_rotate();
}
ret2 = min(ret2, ret);
print(a);
memcpy(a, origin, sizeof(a));
} while (next_permutation(idx.begin(), idx.end()));
cout << ret2 << '\n';
}
이것도 틀렸다고 나오네요..
도움이 못되어서 죄송합니다.
감사합니다.
2주차 개념#12 트리 순회
0
8
2
백준사이트가 종료된다고 합니다.
0
200
2
백준 서비스 종료
9
633
1
sk 하이닉스 코테 대비
0
346
2
3-G 최댓값 질문
0
46
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
77
2
3-I 코드 질문드립니다.
0
59
2
3-N 질문 있습니다.
0
63
2
학습방법
0
98
2
4-H 질문 있습니다 (코드 리뷰)
0
65
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
161
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
68
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
62
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
48
2
조합 재귀 풀이 확인 해주시면 감사하겠습니다.
0
66
2
함수별 시간복잡도
0
71
2
3-h 질문입니다.
0
47
1
안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.
0
51
2
1-I 문제 질문 드립니다.
0
74
2
2-P 질문입니다.
0
55
1
mac에서 시작하기 관련
0
86
2
5-Q 질문
0
62
2
풀이 코드 질문
0
62
2
맞왜틀
0
67
2

