mrseos   3년 전

안녕하세요. 분할정복으로 문제를 풀었는데 수행시간이 너무 오래걸려 글을 쓰게 됐습니다.

JAVA 1등의 경우 68ms와 비교해보니 약 38배정도 차이가 나는 것 같습니다.

혹시 어떤 부분을 손을 봐야 시간을 줄일 수 있을까요?

읽어주셔서 감사합니다.

http://boj.kr/3ebd6978fcdb4b19...


jyon   3년 전

 구현하신 방법은 경로를 처음부터 따라가면서 현재 칸이 (r,c) 인지를 확인하는 것 같은데요. 

잘 생각해 보면 (r,c)가 몇 번째 사분면에 위치하는 지를 알 수 있고, 각 사분면에 포함된 칸 수는 (2n-1)2=22n-2 인 것을 알고 있기 때문에 경로를 다 만들 필요가 없습니다.

mrseos   3년 전

먼저 제가 알지 못했던 부분에 대해 도움을 주셔서 감사합니다.

기존의 소스에서 약 1/3 ms 정도 단축시킬 수 있었습니다.

http://boj.kr/c88379f9d8e945ea...

혹시 여기서도 더 시간을 줄일 수 있는 부분이 존재하는지 재질문드려도 될까요?

djm03178   3년 전

size==2인 경우뿐만 아니라 모든 size에 대해서 적용시킬 수 있습니다. jyon님의 답변을 다시 한 번 잘 읽어보세요.

mrseos   3년 전

아.. 기저조건 자체가 매우 잘못됐네요...

기존 소스에서 djm03178님의 답변을 통해 isRange함수의 역할을 해당 사분면 범위내의 (y, x)가 속해있는가?로 다시 한번 스스로 정의를 해봤습니다.

속해있다면 다시 탐색하고, 속해있지 않다면 마치 탐색한 것 처럼 사이즈의 제곱을 answer에 더해주었습니다.

그래서 (y,x)가 (r,c)가 됐을 때 종료하는 것을 기저조건으로 변경했고, 시간적으로 매우 개선됐음을 확인했습니다.

이렇게 적고보니 jyon님의 말씀대로 다시 적게 됐네요...

답변을 달아주신 두 분께 정말 감사의 말씀드립니다!

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