작성
·
36
0
안녕하세요! 쿼드트리 문제를 풀던 중, 도저히 감이 잡히지 않아서
4구역으로 나누어 문제를 해결해야 한다는 힌트를 얻고, 문제를 풀었습니다.
예제로 테스트 완료 후에 큰돌님 해설과 비교하는 과정에서 제 코드와 조금 다른 점을 발견했습니다.
아래 링크는 제가 작성한 코드입니다.
http://boj.kr/ba004714b82449848c1e7cafc9afb6f7
go라는 함수에서 bool 값을 통해 그냥 값을 내보낼지, 괄호 안에 다시 4구역의 값을 구해 넣을지를 다음 단계에서 수행하도록 했는데, 웬만한 테스트케이스에서는 잘 통과함에도 불구하고 틀렸다는 결과가 나오더라구요
4구역으로 나누어 다시 재귀함수를 호출하는 부분이 꼭 이중for문 내부에 있어야만 하는 건가요?
틀린 이유를 찾고 싶어서 질문 드립니다 ㅜㅜ
답변 2
1
안녕하세요 소현님 ㅎㅎ
for(int i = y; i < y+size; i++) {
for(int j = x; j < x+size; j++) {
if(mapp[i][j] != val) { // 첫 요소랑 하나라도 다르면
will_go = true; break; } // 다음 단계로
else {
will_go = false; continue; }
}
}
이부분이 문제입니다.
만약 다르면 -> BREAK를 거는데 for문에서 break는 가장 가까운 for문을 나오게 되는 것입니다.
즉, 안쪽 for문만 나오고 바깥쪽에서 걸려서 -> 진행되다 will_go가 false가 되는 대참사가 일어날 수 있는 코드가 되어버립니다.
이부분만 고쳐보시겠어요?
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
sohyeon님께서 작성하신 쿼드트리 코드에 대한 질문 주셔서 감사합니다. 쿼드트리 문제는 분할 정복 방식으로 행렬을 재귀적으로 분할하는 방식으로 해결할 수 있습니다. 이 문제의 핵심은 모든 값이 같은지 확인하고, 그렇지 않을 경우 4분할하여 재귀적으로 해결하는 것입니다.
재귀를 이용한 분할: 쿼드트리 문제에서는 주어진 영역내 모든 값이 동일한지를 먼저 확인한 다음, 동일하지 않다면 4개로 분할하여 재귀적으로 각 부분을 처리한다는 점을 명심해야 합니다. 이 두 부분은 이중 for
루프 안에 있을 필요는 없지만, 접근 방식에 따라 다르게 구현될 수 있습니다.
일관된 재귀 호출: go
함수에서 재귀적으로 4개의 구역을 나누어 호출하는 부분이 중요합니다. 이 과정에서 조건이 제대로 설정되지 않으면 예상치 못한 결과가 나오게 됩니다.
Bool 값 체크: 코드를 설계할 때, 특정 조건에 따라 재귀를 호출하는지 여부를 잘 점검해야 합니다. 관련된 특정 조건의 불일치가 문제의 원인일 수 있으니, bool 값의 확인 조건을 다시 점검해 보세요.
관련된 부분에서 유사한 쿼드트리 문제와 해결 방법에 대한 정보를 공유드릴게요:
- 쿼드트리 문제: 이 링크에서는 다른 수강생분들이 쿼드트리 문제를 해결하며 겪은 어려움과 그에 대한 해결 방법들을 확인하실 수 있습니다.
다른 코드를 참조하고, 배열의 잘못된 인덱스 사용이나 값 비교 로직의 오류를 점검해 보시면 좋을 것 같습니다. 추가적으로 문제가 계속되어 어려움을 느끼신다면, 구체적으로 어떠한 케이스에서 실패하는지 더 알아보고 확인해 보시는 것도 좋은 방법입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
말씀해주신 부분 검토하고, 완전히 이중for문을 나올 수 있도록 코드 수정했더니 정답처리 되었습니다!
도움 주셔서 감사합니다 🙌