5 - O : 17406 질문 있습니다
구현하고 예제 및 반례를 넣어보고 디버깅도 나름 해봤는데 도저히 틀린 점을 못 찾겠습니다. 강의와 접근 방식이 조금 다르지만 비슷한 것 같은데 어떤 점에서 틀린 건지 알려주시면 감사할 것 같습니다 ㅠㅠ
#include <bits/stdc++.h>
using namespace std;
int N, M, K, mp[51][51], temp_mp[51][51], ret=INT_MAX;
vector<vector<int>> v;
vector<int> choose_v;
int visitied[10]={0,};
int dy[4]={1,0,-1,0}, dx[4]={0,1,0,-1};
void rotate(int y,int x,int sz){
for (int i=1;i<=sz;i++){
int start_y=y-i;
int start_x=x-i;
int start_val=temp_mp[start_y][start_x];
int temp_y=start_y;
int temp_x=start_x;
for (int j=0;j<4;j++){
int rotate_flag=i*2;
while(rotate_flag--){
// printf("%d,%d ",temp_y,temp_x);
temp_mp[temp_y][temp_x]=temp_mp[temp_y+dy[j]][temp_x+dx[j]];
temp_y+=dy[j];
temp_x+=dx[j];
}
//printf("\n");
}
temp_mp[start_y][start_x+1]=start_val;
}
}
void choose(int sz,vector<int> &_choose_v){
// printf("sz: %d\n",sz);
// for (int&i:_choose_v){
// printf("%d ",i);
// }
// printf("\n");
// printf("%d %d\n",visitied[0],visitied[1]);
if (sz==K){
for (int i=1;i<=N;i++){
for (int j=1;j<=M;j++){
temp_mp[i][j]=mp[i][j];
}
}
for (int i=0;i<10;i++){
visitied[i]=0;
}
for (int&i:_choose_v){
rotate(v[i][0],v[i][1],v[i][2]);
for (int j=1;j<=N;j++){
int sum=0;
for (int k=1;k<=M;k++){
sum+=temp_mp[j][k];
}
if (sum<ret){
ret=sum;
}
}
}
//printf("\n");
return;
}
for (int i=0;i<K;i++){
if (find(_choose_v.begin(),_choose_v.end(),i)==_choose_v.end()){
_choose_v.push_back(i);
visitied[i]=1;
choose(sz+1,_choose_v);
visitied[i]=0;
_choose_v.pop_back();
}
}
}
int main()
{
cin >> N >> M >> K;
for (int i=1;i<N+1;i++){
for (int j=1;j<M+1;j++){
cin >> mp[i][j];
}
}
for (int i=0;i<K;i++){
vector<int> temp_v;
for (int j=0;j<3;j++){
int temp;
cin >> temp;
temp_v.push_back(temp);
}
v.push_back(temp_v);
}
choose(0,choose_v);
// for (int i=1;i<N+1;i++){
// for (int j=1;j<M+1;j++){
// printf("%d ",temp_mp[i][j]);
// }
// printf("\n");
// }
cout << ret;
}choose()함수를 통해 순열을 만들고 choose()의 인자인 sz가 K가 되면, 순열의 순서에 맞게 rotate한 후 최솟값을 찾을 수 있도록 작성했습니다.
답변 3
1
해결했습니다. rotate가 모두 끝나고 최솟값을 구한 게 아닌 각 겹의 rotate를 할 때마다 최솟값을 구했네요...
0
아 그렇군요..
사실 이 코드 제가 어제도 1시간 정도 보고 테스팅해보고 반례 찾고.. 그랬는데 아무 이상 없어서 이게 왜 안되지.. 하다가 오늘도 지금 일 끝나고 다시 보려고 했는데 해결하셨네요.. ㅎㅎ
다음번에는 좀 더 빠르게 제가 먼저 해결해서 답변 드릴 수 있도록 노력하겠습니다.
죄송하고 감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
제가 코드를 직접 실행해보지는 않았지만, 주어진 코드에서 몇 가지 문제점을 발견했습니다.
temp_mp배열이 초기화되지 않았습니다.temp_mp배열은mp배열과 동일한 값을 가지지만, 회전 연산을 수행하기 위해 사용되는 배열로 보입니다. 회전 연산을 수행하기 전에temp_mp배열을mp배열로 초기화해야 합니다.choose_v벡터의 이름이 오타가 있습니다. 코드 내부에서는_choose_v라는 벡터를 사용하고 있는데, 함수의 인자로 들어오는 벡터의 이름을choose_v로 수정해야 합니다.회전 연산을 수행한 뒤에는
choose함수가 호출될 때마다temp_mp배열을 초기화해야 합니다. 현재 코드에서는 회전 연산을 한 후에도temp_mp배열이 그대로 유지되기 때문에 잘못된 결과가 출력될 수 있습니다. 회전 연산이 끝난 후에temp_mp배열을 복사해서 사용하거나,choose함수가 호출될 때 마다 초기화 하는 등의 방법을 사용해야 합니다.
이외에도 추가적인 문제점이 있을 수 있습니다. 코드 실행 중 발생하는 에러 메시지나 잘못된 결과 등을 확인하고 수정해보시기 바랍니다. 참고로, 구체적인 오류 부분을 확인하려면 어떠한 입력 조건에 대해서도 올바른 결과를 반환하는지 확인해보는 것도 좋은 방법입니다. 다른 테스트 케이스도 고려해보면서 코드를 수정해보시기 바랍니다. 궁금한 점이 있으면 언제든지 물어보세요. 감사합니다.
4 - A
0
22
2
코딩살구클럽 입장이 안됩니다
0
60
2
4-F 경우의 수 질문입니다.
0
32
2
코딩살구클럽 가입이 안됩니다.
0
74
2
살구 클럽에 대한 질문있습ㄴ디ㅏ
0
54
1
교안 158페이지 문의드립니다
0
44
2
코딩살구클럽 관련 건의사항
0
114
1
코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다
0
44
1
진행 방법 질문드립니다!
0
80
2
2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.
0
63
2
2주차 개념#12 트리 순회
0
32
2
백준사이트가 종료된다고 합니다.
0
315
2
백준 서비스 종료
9
950
1
sk 하이닉스 코테 대비
0
385
2
3-G 최댓값 질문
0
54
1
모듈러 연산 값이 10이 아닌 경우도 있지 않나요?
0
84
2
3-I 코드 질문드립니다.
0
65
2
3-N 질문 있습니다.
0
68
2
학습방법
0
105
2
4-H 질문 있습니다 (코드 리뷰)
0
69
2
코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.
0
182
2
2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.
0
72
2
2주차 개념 #4-2. 인접행렬 질문있습니다.
0
65
2
1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.
0
53
2





