17411번 - 가장 긴 증가하는 부분 수열 6
맨 아랫줄에
cout << sum[1].back() % MOD; 이부분을
cout << (sum[1].back() + MOD) % MOD; 으로 고쳐야 코드가 통과됩니다.
제가 생각하기로는 sum[1].back() 은 음수가 나오지 않기 때문에
sum[1].back() % MOD 랑 (sum[1].back() + MOD) % MOD 는 차이가 없다고 생각되는데
제가 놓치고 있는게 있는지 궁금해서 질문 드립니다!
채점할 때 sum[1].back>=0인지 assert()로 확인해 보세요. 제가 코드를 이해한건 아니지만 둘이 다른 경우는 음수인 경우밖에 없고 44번줄로 인해 음수가 나올수도 있을 것 같습니다.
...제 코드인가요 ???
44번 줄이 문제인 거 맞습니다. 저 부분합이 중간에 MOD값을 넘어가게 되면 논리적으로는 큰 거에서 작은 걸 빼는 거지만 계산한 값은 음수가 나올 수 있습니다. 그러면 47번 줄에서 다시 음수가 나올 수 있습니다.
가장 깔끔한 해결책은 44번 줄에다 + MOD % MOD를 하는 거라고 생각합니다.
감사합니다
문제가 어려워서 구글에 풀이법도 별로 없고해서 푸신분들 코드 보면서 가장 깔끔하신거같아서 참고했던것같습니다.
@sait2000
실례를 무릎쓰고 질문 하나만 드리겠습니다..
위 코드에서41~48번째 줄의 의미를 아무리 고민해봐도 잘 모르겠습니다.
저 과정을 수행하면 num과 sum이 나와 정답이 나온다는것은 이해하는데 왜 그런 아이디어가 쓰였는지 궁금합니다..
댓글을 작성하려면 로그인해야 합니다.
cocoon 3년 전
맨 아랫줄에
cout << sum[1].back() % MOD; 이부분을
cout << (sum[1].back() + MOD) % MOD; 으로 고쳐야 코드가 통과됩니다.
제가 생각하기로는 sum[1].back() 은 음수가 나오지 않기 때문에
sum[1].back() % MOD 랑 (sum[1].back() + MOD) % MOD 는 차이가 없다고 생각되는데
제가 놓치고 있는게 있는지 궁금해서 질문 드립니다!