prunusnira   3년 전

백트래킹으로 해결하고자 했습니다

로컬로 테스트를 해봤을 때 각종 스도쿠 문제들을 대입했을 때도 풀이에는 문제가 없는것 같습니다

속도도 빠른편이구요

그러나 타임아웃이 발생하고 있습니다. (45%, 86%에서 발생)

로컬에서 테스트를 해봤을 때 (buffered reader/writer를 사용한 읽기/쓰기(flush) 파트 제외)

9*9를 모두 0으로 채운 경우 15ms 이내, 문제에서 제시하는 예시는 10ms 이내,

그리고 인터넷상에서 찾은 고난이도 스도쿠 문제들을 입력해도 150ms 이하로 답변이 나옵니다.

입출력 처리에 걸리는 시간을 고려해도 1초가 되지 않을것 같은데 무엇이 문제일까요?

그리고 이 문제와 관련하여 더 개선할 수 있는 방법이 있을까요? (백트래킹을 사용한 채로)

* 코드 설명

solve:

1) (i, j) 각 케이스에 대해 처리를 시작합니다. (i, j)의 값이 0이 아니라면 다음 칸으로 스킵합니다

2) 마지막 칸에 도달했다면 출력 후 종료합니다

find:

1) solve에서 (i, j)가 0이라면 가로/세로/3*3 범위내에서 중복되는 가용 숫자들을 찾아내고 각 케이스에 대해 다음 칸을 처리합니다

2) 가용 가능한 숫자가 없다면 리턴하고 이전단계로 되돌아갑니다

fabi88   3년 전

find 함수가 너무 비대하여 시간 초과가 발생하는 것으로 보입니다.

특히 check 함수들에서 해당 범위를 만족하는지를 파악할 때 범위 전체를 기준으로 두기 보다

값 하나에 집중하여 1부터 9까지 숫자를 대입하여 보고 기준을 만족하는지 확인하여 채워 넣는 방향으로 구현하면 좋을 것 같습니다.

예를 들어 checkHr 함수는 아래와 같이 특정 값에 대해 조건을 만족하는지 확인하도록 변형할 수 있습니다.

이렇게 하면 불필요한 리스트 생성 및 리스트 검색/제거 과정이 사라져 속도 향상이 있을 것이라 생각됩니다.

댓글을 작성하려면 로그인해야 합니다.