99클럽 코테 스터디 2일차 TIL

Jin·2024년 10월 29일
post-thumbnail

2일차 TIL

오늘의 학습 키워드

먼저 생각하고 코드 작성, 수식 활용하기

오늘의 회고

문제

오늘 문제는 수식으로 표현만 잘 하면 크케 어려운 부분은 없었다.

사고과정은 다음과 같다.


간격이 늘어나는 상태로 + 가장 많은 간격 횟수를 구해야한다.

처음 간격을 a라고 하면, 최소 간격은

a,a+1,a+2,a+3,a+4a,a+1,a+2,a+3,a+4 ..... 이런식으로 갈것이다.

가장 마지막 도착지를 k라고 하고, max 간격 횟수를 m번이라고 하면

a+(a+1)+(a+2)+...(a+m1)=ka+(a+1)+(a+2)+ ... (a+m-1) = k 라는 식이 성립된다.

정리하면

ma+((m1)+1)×(m1)/2=kma + ((m-1)+1)\times(m-1)/2 = k 이고 한단계 간격을 +1로 최소한의 간격을 표현한것이기 때문에

ma+((m1)+1)×(m1)/2<=kma + ((m-1)+1)\times(m-1)/2 <= k 로 표현 할 수 있다.

우리는 m의 최댓값을 구하는 것이기 때문에

k((m1)+1)×(m1)/2>=mk - ((m-1)+1)\times(m-1)/2 >= m 이 성립하는 m의 최댓값을 구하면 된다.

그런데, m의 최댓값을 구하는 과정에서 1부터 시작하거나 k부터 시작하면 시간이 너무 오래 걸릴 가능성이 있기때문에, 시작점을 잘 설정하는것이 중요하다.

ma+((m1)+1)×(m1)/2ma + ((m-1)+1)\times(m-1)/2 <= k이 식에서

((m1)+1)×(m1)/2<=k((m-1)+1)\times(m-1)/2 <= k 이고,

((m1)+1)×(m1)<=2k((m-1)+1)\times(m-1) <= 2k 이므로,

((m1)+1)×(m1)<=m2<=2k((m-1)+1)\times(m-1) <= m^2 <= 2k 이기 때문에

m을 2k\sqrt{2k} 의 정수부분으로 잡고, 1씩 감소하여 만족하는 m값이 나타날 때까지 과정을 반복하는 식으로 설정하니 시간을 보장할 수 있었다.

내가 구현한 식은 다음과 같다.

profile
develop을 꿈꾸는

0개의 댓글