백준(boj)1074 - Z

업데이트:

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

👀문제이해 및 풀이방법

쉬운문제인데 계속 시간초과가 뜨길래 뭔가 잘못됬나 한참을 고민했다.
주요 핵심은 DC의 가지들을 순서대로 배치하며 들어가야 하는 곳에만 들어가고 앞에 있는 칸의 개수를 더해주면 된다
일일히 모든 가지에 들어가지 않도록 하는 것이 중요하다

이상하게 계속 시간초과가 나서 뭐가 문제인지 한참을 고민했는데 큰쪽 부등호에 등호를 안붙혀서 무한히 돌고있었다😥

📝코드

#include <iostream>
#include <vector>
using namespace std;
class Z{
private:
    vector<vector<int>> map;
    int N;
    int r,c;
    int sol=0;
public:
    Z(){
        std::cin >> N >> r >> c;
    }
    void DC(int x,int y,int size){
        if(size==1)    
            return ;
        int nsize=size/2;
        if(x+nsize>r && y+nsize>c)    
            DC(x,y,nsize);
        else if(x+nsize>r&&y+nsize<=c){
            sol+=nsize*nsize;
            DC(x,y+nsize,nsize);
        }
        else if(x+nsize<=r&&y+nsize>c){
            sol+=nsize*nsize*2;
            DC(x+nsize,y,nsize);
        }
        else{
            sol+=nsize*nsize*3;
            DC(x+nsize,y+nsize,nsize);
        }
    }
    void find_sol(){
        DC(0,0,1<<N);
        std::cout << sol << '\n';
    }
};
int main(){
    Z z;
    z.find_sol();
    return 0;
}

image

댓글남기기