백준 1074번 문제 바로가기

문제에 대한 첫 인상

반복되는 패턴이 있기에 분할해서 풀어나가면 좋겠다는 생각을 하게 되었다. 재귀함수를 세우는게 가장 깔끔해보여서 epoch()함수를 재귀해가면서 풀어내었다.

재귀함수는 결과물을 보면 깔끔한데 직접 구현하는건 은근 까다롭단 말이지… n과 전체 길이를 자꾸만 헷갈려서 코드를 고치기를 거듭했다. ㅜㅜㅋㅋ 문제를 처음부터 제대로 보고 한번에 풀어내는 연습하쟈!!

#include <iostream>
#include <cmath>

using namespace std;

long long epoch(int n, int r, int c){ // r행 c열
    if (n == 0){
        return 0;
    }

    int size = 1 << n;
    int half = size / 2;
    
    if (r < half && c < half){
        return epoch(n-1, r, c);
    } else if (r < half && c >= half){
        return pow(half, 2) + epoch(n-1, r, c-half);
    } else if (r >= half && c < half){
        return 2*pow(half, 2) + epoch(n-1, r-half, c); 
    } else{
        return 3*pow(half, 2) + epoch(n-1, r-half, c-half);
        cout << "yes" << endl;
    }
}

int main()
{
    int n, r, c;
    cin >> n >> r >> c;
    cout << epoch(n, r, c);
    
    return 0;
}