lklim79   3년 전

우선 제가 짠 코드는 시간초과 뜨네요 혹시 여기서 줄일 방법이 있나요? 아님 다시 새로 짜야하나요?

byeongkeunahn   3년 전

1. a가 최대 10,000,000이므로 3중 for문을 돌면 10^21번의 연산이 발생해 시간초과가 납니다.

2. a가 최대 10,000,000이므로 c값은 기껏해야 c * (c+1) / 2 <= 10,000,000인 최대의 c까지밖에 증가하지 않습니다. c = 5,000 정도면 충분합니다.

3. j에 대한 for문은 j값이 맞아떨어지는 경우가 딱 한 번밖에 없으므로 그냥 i와 c값으로 j를 계산하면 됩니다. 여기까지 하면 5,000짜리 for문을 2회 중첩하게 되므로 시간 초과는 피할 것 같지만, 그렇지 않습니다.

4. a번째 분수만 필요하므로 b배열에 1번 분수, 2번 분수, ...으로 누적하는 대신 몇 번째 분수까지 보았는지 세고 a번째가 되었을 때 출력한 후 종료하면 됩니다. 여기까지 하면 시간 초과가 드디어 사라집니다. 하지만 틀립니다.

5. 문제의 지그재그를 잘 보면 c값의 홀짝성에 따라 매번 방향이 바뀝니다. 이걸 고려해주면 맞게 됩니다.

6. 사실 처음부터 분수를 하나씩 볼 필요 없이 a를 c값이 얼마인 대각선에서 몇 번째인지 정보로 변환하고 시작하면 O(1)에 해결 가능합니다. 하지만 6번은 우선 5번까지 끝낸 후에 생각해보시면 좋을 것 같아요.

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