luh5063014   1년 전

처음에 루프문을 이용하여 N++ 증가시키는 방식을 사용하였다가 시간 초과 나서 

수학 공식을 이용하라는 내용이 있길래 마음대로 수학 공식을 대입해서 문제를 해결했습니다만

본래 루프문을 이용할 경우 수학 공식을 대입하지 않고 어떻게 시간을 줄일 수 있는 방법에 대하여 궁금합니다.

어떻게 접근해야할까요? 애초에 루프문을 이용하지 않는 것이 상책인 것인가요?

kokosoko59   1년 전

네. 문제에서 주어진 범위가 10억이기 때문에 n을 1씩 증가시켜서 루프를 도는것은 시간초과를 피할수 없습니다.

주어진 시간이 1초여도 어려운데 심지어 이 문제는 0.15초이기 때문에 거의 불가능합니다.

n을 1씩 증가시키는게 아니라 한번에 여러개씩 증가시키는 방법이 혹시 있다면 가능할지도 모르겠네요.

luh5063014   1년 전

시간 제한을 걸어 간단한 루프를 이용하는 것이 아닌 수학 공식을 무조건 사용할 수 밖에 유도하는 문제이군요.

감사합니다~ 나중에 다른 방법도 생각해보겠습니다.

masterchip   1년 전

루프문을 이용할 수 있습니다

최대 예상 소요일과 최소 예상 소요일 사이에서 루프하면 시간내에 처리할 수 있습니다.

kokosoko59   1년 전

@masterchip 흥미로운 방법이네요. 최대 예상 소요일이랑 최소 예상 소요일은 어떻게 계산하는게 적당할까요? 

masterchip   1년 전

@kokosoko59 최대는 v / (a-b)로 보고 최대에서 a / (a-b)를 빼면 최소라고 볼 수 있을겁니다

(a-b)가 일일 증가량이고 a에서 (a-b)를 나누면 a만큼 오르기 위한 소요일이기 때문에 최대 일수에서 빼면 최소라고 생각됩니다.

a가 크거나 b가 작으면 v/(a-b)는 낮은 수이므로 시간내에 처리할 수 있고

a가 작거나 b가 크면 최대와 최소의 차이가 적어서 시간내에 처리할 수 있다고 보입니다.

kokosoko59   1년 전

@masterchip 그렇게 하면 v = 1000000000, a = 500000000, b = 499999999 일때  최소,최대가 [500000000,1000000000] 이라서 500000000번 루프를 돌게 됩니다. 시간 초과가 날 것 같습니다.

kokosoko59   1년 전

생각해보니 미끄러지기 전에 다 올랐는지 체크하는 과정에서 500000000 루프를 돌 필요 없이 끝나게 되겠네요 흥미로운 풀이 공유해주셔서 감사드립니다!

kemin1910   1년 전

혹시 제가 풀이에 참고해보려고 하는데 A + (A - B) * (N - 1)에서 N이 아니라 (N - 1)인 이유는 맨 앞에 A라는 수가 있고 거기에 날이 지날 때마다 변화하는 값 (A - B)를 더해주는 것이기에 이미 하루가 지났다는 의미에서 날짜를 표현하는 변수인 N을 그대로 사용하지 않고 1을 빼서 사용했다고 생각해도 될까요?

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