해결된 질문
작성
·
188
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
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
조건은 불필요합니다.
이 두 가지 수정 후에도 문제가 해결되지 않는다면, 본인의 코드를 다시 한 번 꼼꼼히 확인하시거나, 추가적인 반례를 찾아보실 필요가 있습니다. 혹시 모르시는 부분이 있다면 백준 질문 게시판에 다른 사람들의 테스트 케이스를 참고하셔도 좋으며, 직접 다양한 케이스를 만들어 테스트 해보시기를 추천드립니다.
부족한 점 있으시면 언제든지 질문주세요. 화이팅입니다!