인프런 커뮤니티 질문&답변

JOXXEP님의 프로필 이미지
JOXXEP

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

5 - O : 17406 질문 있습니다

해결된 질문

작성

·

292

0

구현하고 예제 및 반례를 넣어보고 디버깅도 나름 해봤는데 도저히 틀린 점을 못 찾겠습니다. 강의와 접근 방식이 조금 다르지만 비슷한 것 같은데 어떤 점에서 틀린 건지 알려주시면 감사할 것 같습니다 ㅠㅠ

#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

JOXXEP님의 프로필 이미지
JOXXEP
질문자

해결했습니다. rotate가 모두 끝나고 최솟값을 구한 게 아닌 각 겹의 rotate를 할 때마다 최솟값을 구했네요...

큰돌님의 프로필 이미지
큰돌
지식공유자

아 그렇군요..

사실 이 코드 제가 어제도 1시간 정도 보고 테스팅해보고 반례 찾고.. 그랬는데 아무 이상 없어서 이게 왜 안되지.. 하다가 오늘도 지금 일 끝나고 다시 보려고 했는데 해결하셨네요.. ㅎㅎ

다음번에는 좀 더 빠르게 제가 먼저 해결해서 답변 드릴 수 있도록 노력하겠습니다.

죄송하고 감사합니다.

0

큰돌님의 프로필 이미지
큰돌
지식공유자

밑에 답글 달았습니다. :)

0

안녕하세요, 인프런 AI 인턴이에요.
제가 코드를 직접 실행해보지는 않았지만, 주어진 코드에서 몇 가지 문제점을 발견했습니다.

  1. temp_mp 배열이 초기화되지 않았습니다. temp_mp 배열은 mp 배열과 동일한 값을 가지지만, 회전 연산을 수행하기 위해 사용되는 배열로 보입니다. 회전 연산을 수행하기 전에 temp_mp 배열을 mp 배열로 초기화해야 합니다.

  2. choose_v 벡터의 이름이 오타가 있습니다. 코드 내부에서는 _choose_v라는 벡터를 사용하고 있는데, 함수의 인자로 들어오는 벡터의 이름을 choose_v로 수정해야 합니다.

  3. 회전 연산을 수행한 뒤에는 choose 함수가 호출될 때마다 temp_mp 배열을 초기화해야 합니다. 현재 코드에서는 회전 연산을 한 후에도 temp_mp 배열이 그대로 유지되기 때문에 잘못된 결과가 출력될 수 있습니다. 회전 연산이 끝난 후에 temp_mp 배열을 복사해서 사용하거나, choose 함수가 호출될 때 마다 초기화 하는 등의 방법을 사용해야 합니다.

이외에도 추가적인 문제점이 있을 수 있습니다. 코드 실행 중 발생하는 에러 메시지나 잘못된 결과 등을 확인하고 수정해보시기 바랍니다. 참고로, 구체적인 오류 부분을 확인하려면 어떠한 입력 조건에 대해서도 올바른 결과를 반환하는지 확인해보는 것도 좋은 방법입니다. 다른 테스트 케이스도 고려해보면서 코드를 수정해보시기 바랍니다. 궁금한 점이 있으면 언제든지 물어보세요. 감사합니다.

JOXXEP님의 프로필 이미지
JOXXEP

작성한 질문수

질문하기