백준(boj) 14391 - 종이조각

업데이트:

문제 링크 - https://www.acmicpc.net/problem/14391

👀문제이해 및 풀이방법

전형적인 브루트 포스 문제중 dfs문제이다. 하지만 조금 복잡하다 기본적으로 Q,stack이 아닌 재귀방식의 백트래킹을 사용해야 한다.

한칸씩 넘어가면서 재귀호출 하는 방식이 익숙하지 않다면 힘들것 같다.. 생각보다 시간이 많이 걸렸는데 더 효율적으로 풀 수 있는 방법이 있는지는 모르겠다

오른쪽과 아래쪽을 visit배열에 체크해 두면서 재귀를 돌리면 된다 어렵다기 보다는 복잡하다는게 더 어울리고 익숙해질 필요가 있는 문제유형이라는 생각을 하였다

📝코드

#include <iostream>
#include <vector>
using namespace std;
class paper{
private:
    vector<vector<char>> map;
    vector<vector<bool>> visit;
    int N,M,MAX=0;
public:
    paper(){
        std::cin >> N >> M;
        map.resize(N,vector<char>(M));
        visit.resize(N,vector<bool>(M,false));
        set_val();
        
    }

    void set_val(){
        for(int i=0;i<N;i++)
            for(int j=0;j<M;j++)
                std::cin >> map[i][j];
    }
    
    void dfs(int x,int y,int val){
        if(y==M){
            dfs(x+1,0,val);
            return ;
        }
        else if(x==N){
            MAX=max(MAX,val);
            return ;
        }
        else if(visit[x][y]==true){
            dfs(x,y+1,val);
            return ;
        }
        string str = "";
        for(int cy = y;cy<M;cy++){
            if(visit[x][cy]==true)
                break;
            str+=map[x][cy];
            for(int j=y;j<=cy;j++)
                visit[x][j]=true;
            dfs(x,cy+1,val+stoi(str));
            for(int j=y;j<=cy;j++)
                visit[x][j]=false;

        }
        str = "";
        for(int cx = x ; cx<N;cx++){
            if(visit[cx][y]==true)
                break;
            str+=map[cx][y];
            for(int i=x;i<=cx;i++)
                visit[i][y]=true;
            dfs(x,y+1,val+stoi(str));
            for(int i=x;i<=cx;i++)
                visit[i][y]=false;
        }
        


    }
    void find_sol(){
        dfs(0,0,0);
        std::cout << MAX << "\n";
    }




};
int main(){
    cin.tie(NULL);cout.tie(NULL);
    ios_base::sync_with_stdio(false);
    paper pp;
    pp.find_sol();

    return 0;
}

댓글남기기