Date:

1) 문제 링크

https://www.acmicpc.net/problem/1780

2) 접근

1780과 상당히 유사한 문제다. isSame 함수나 인수로 level 변수 넣는 거 많이 갖다 썼다. 차이점이 있다면 자료형이 문자라는 점?

3) 풀이

#include <iostream>
using namespace std;

int N;
char arr[64][64];

char isSame(int sy, int sx, int ey, int ex){
    char cr = arr[sy][sx];

    for(int i=sy; i<=ey; ++i){
        for(int j=sx; j<=ex; ++j){
            if(cr != arr[i][j]) { return -1; }
        }
    }
    return cr;
}

void solve(int y, int x, int level){
    if(level > 1){
        char kind = isSame(y, x, y+level-1, x+level-1);
        if(kind != -1){
            cout << kind;
            return;
        }
    }
    else{
        cout << arr[y][x];
        return;
    }

    cout << "(";
    solve(y, x, level/2);
    solve(y, x+level/2, level/2);
    solve(y+level/2, x, level/2);
    solve(y+level/2, x+level/2, level/2);
    cout << ")";

    return;
}

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> N;
    for(int i=0; i<N; ++i){
        for(int j=0; j<N; ++j){
            cin >> arr[i][j];
        }
    }

    solve(0, 0, N);

    return 0;
}

image

시간 복잡도는 $O(NlogN)$
+이 문제 풀고 실1 승급함. 좀만 더 하면 골드!!

(2021-08-12) 지금은 골2이긴 한데… 이때랑 실력은 별 차이 없는 듯 ㅋㅋ

4) 피드백

나중에 할 거 있으면 추가할 예정.

Leave a comment