15998번 - 카카오머니
우선 감사하다는 말씀부터 드리겠습니다. 그리고 코드가 지저분해서 죄송합니다.
주석은 성심성의껏 달아놓았습니다.
예제코드와 질문글에 있는 반례코드 모두 정상작동 하고, 어느 부분이 틀렸는지 도저히 제 눈에는 보이지 않아서 이렇게 질문 글을 남깁니다.고수님들의 조언 기다리겠습니다! 감사합니다~
---------수정된 코드를 댓글에 첨부했습니다-----------
21~28이 매우 오래 걸릴 수 있습니다
첫 줄에 -1 10^18 같은 게 들어오면 저 루프는 대략 10^9번 실행됩니다
좋은 지적 감사합니다. 혹시 저런 방법을 쓰지 않고 찾아 낼 수 있는 방법이 있을까요?
우선 약수를 이용해서 기존에 오류가 있던 부분만 수정해봤는데(시간 복잡도는 고려하지 않음) 여전히 틀렸습니다가 나옵니다. 어느 부분이 문제일까요 ㅠㅠ?
추가 발견) 맨 아래 77~81번 줄 출력 부분에서 만약 list m은 존재하지만 유효한 범위 내의 수를 갖지 않는 경우, -1을 출력할 수 있도록 예외 처리 하였음에도 틀렸습니다가 뜹니다 ㅠㅠ
또 추가발견) 63~65번 줄 부분은 validate 함수와 맞지 않는 내용이어서 그냥 now + a != b일때 chk = True로 하고 break 걸었더니 드디어 시간초과가 뜨네요!
시간초과가 뜨고 행복한건 처음이네요 ㅠㅠ.. 아마 약수를 찾는 과정에서 범위를 좀 더 효율적으로 설정해줄 필요가 있는 것 같아요.
지금까지 총 얻어낸 반례로는 아래 같은 것들이 있네요.
이 쉬운 예외들을 간과하고 있었네요...
좀 큰 힌트같기는 한데, 모든 약수를 다 구할 필요 없습니다. 최대공약수를 구하는 빠른 알고리즘(유클리드 호제법)으로 최대공약수만 계산하면 됩니다. 그리고 유효성 검사도, 그냥 b보다 크기만 하면 통과한다는 걸 생각해보면 알 수 있습니다.
힌트 정말 감사합니다!!!
댓글을 작성하려면 로그인해야 합니다.
chaos7061 5년 전
우선 감사하다는 말씀부터 드리겠습니다. 그리고 코드가 지저분해서 죄송합니다.
주석은 성심성의껏 달아놓았습니다.
예제코드와 질문글에 있는 반례코드 모두 정상작동 하고, 어느 부분이 틀렸는지 도저히 제 눈에는 보이지 않아서 이렇게 질문 글을 남깁니다.
고수님들의 조언 기다리겠습니다! 감사합니다~
---------수정된 코드를 댓글에 첨부했습니다-----------