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

박희천님의 프로필 이미지
박희천

작성한 질문수

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

2-E와 분할정복(Divide & Conquer)

2-E 분할 정복 반례를 도저히 못찾겠어요

해결된 질문

작성

·

186

0

안녕하세요 큰돌님.

2-E 쿼드 트리 문제 반례를 도저히 못찾겠습니다.

 

97% 쯤인가 여기서 자꾸 실패가 떠요.백준 질문 게시판에 올라가있는 테스트 케이스를 넣어도 다 통과는 하는데 무슨 반례에 걸리는지 도무지 감이 안잡힙니다.

 

한번 봐주실 수 있나요?

 

#include <bits/stdc++.h>

using namespace std;

int N, adj[70][70];
string input;

string go(int sy, int sx, int size)
{
    int ey = sy + (size - 1);
    int ex = sx + (size - 1);
    // cout << sy << " " << sx << " " << ey << " " << ex << '\n';

    if (size == 2)
    {
        if (adj[sy][sx] == adj[sy][ex] && adj[sy][ex] == adj[ey][sx] && adj[ey][sx] == adj[ey][ex] && N > 2)
            return to_string(adj[sy][sx]);
        string subret = "(";
        subret += to_string(adj[sy][sx]);
        subret += to_string(adj[sy][ex]);
        subret += to_string(adj[ey][sx]);
        subret += to_string(adj[ey][ex]);
        subret += ")";
        return subret;
    }

    string lt = go(sy, sx, size / 2);
    string rt = go(sy, sx + size / 2, size / 2);
    string lb = go(sy + size / 2, sx, size / 2);
    string rb = go(sy + size / 2, sx + size / 2, size / 2);

    // cout << "lt: " << lt << " rt: " << rt << " lb: " << lb << " rb: " << rb << '\n';

    if (lt.size() == 1 && lt == rt && rt == lb && lb == rb && N > 2)
        return lt;
    string ret = "(";
    ret += lt;
    ret += rt;
    ret += lb;
    ret += rb;
    ret += ")";
    return ret;
}

int main()
{
    cin >> N;
    for (int i = 0; i < N; ++i)
    {
        cin >> input;
        for (int j = 0; j < N; ++j)
        {
            adj[i][j] = input[j] - '0';
        }
    }
    string ret = "";
    if (N == 1)
        ret = "1";
    else
    {
        ret = go(0, 0, N);
    }
    cout << ret << '\n';

    return 0;
}

답변 2

1

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

안녕하세요 희천님 ㅎㅎ

반례입니다.

2
11
11

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.
박희천님의 질문 내용을 잘 살펴보았습니다.

코드를 살펴본 결과, 다음 두 가지 문제가 있어보이며 수정이 필요해 보입니다.

첫 번째, size == 2일 때, N > 2인 경우에 대한 검사가 문제를 일으킬 수 있습니다. size가 2인 경우에는 전체 행렬의 크기 N과 관계없이 해당 부분 행렬의 값을 검사해야 하는데, N > 2로 조건을 걸 경우, 전체 행렬의 크기가 2보다 클 때만 해당하는 것으로 잘못된 로직이 적용되었습니다. 이 조건은 제거해야 할 것 같습니다.

두 번째, 쿼드 트리의 분할 정복 과정에서 최종적으로 하나의 색깔로 이루어진 영역을 검사할 때, 전체 크기인 N을 사용하는 대신 해당 영역의 크기인 size를 사용해야 합니다. lt.size() == 1 && lt == rt && rt == lb && lb == rb 조건은 부분 트리들이 모두 하나의 숫자로만 이루어져 있을 때를 검사하는데, 이때 N > 2 조건은 불필요합니다.

이 두 가지 수정 후에도 문제가 해결되지 않는다면, 본인의 코드를 다시 한 번 꼼꼼히 확인하시거나, 추가적인 반례를 찾아보실 필요가 있습니다. 혹시 모르시는 부분이 있다면 백준 질문 게시판에 다른 사람들의 테스트 케이스를 참고하셔도 좋으며, 직접 다양한 케이스를 만들어 테스트 해보시기를 추천드립니다.

부족한 점 있으시면 언제든지 질문주세요. 화이팅입니다!

박희천님의 프로필 이미지
박희천

작성한 질문수

질문하기