[HackerRank/C++] Strange Counter
2023. 2. 8. 09:04ㆍ코딩테스트 해커랭크/Algorithms -Easy
첫번째 시간블럭은 3의 값을 가지고 있으며 이후 갱신될 때마다 자신의 값의 2배로 커진다
시간블럭이 갱신되면 카운트다운 value 값은 시간블럭의 크기만큼에서 1씩 점점 감소한다
t의 값이 주어질때 value의 값을 return 한다
long strangeCounter(long t)
{
long nowBlock = 0;
long prevBlock = 0;
long totalPrevBlock = 0;
long count = 0;
while (nowBlock < t - totalPrevBlock)
{
prevBlock = nowBlock;
totalPrevBlock += prevBlock;
nowBlock = 3 * (long)pow(2, count);
++count;
}
return nowBlock - (t - totalPrevBlock) + 1;
}
문제 지문만 읽으면 복잡하지만 문제에 같이 있는 그림을 보면 이해 자체는 쉽다
생각보다 구현하기 까다로운 문제였는데, 구해야 할 값이 꽤 많고 그 값을 관리해줘야 한다
구해야 할 값은 이전 시간블럭의 크기, 현재 시간블럭의 크기, 이전의 모든 시간블럭을 합친 크기를 구하고
총 카운트 시간인 t에서 이전의 모든 시간블럭을 합친 크기를 뺀 값을 구하며 이 값을 현재 시간블럭의 크기에서 빼야 한다
t에서 totalPrevBlock을 뺀 값이 nowBlock보다 작아질때까지 반복문을 돌려준다
prevBlock에 nowBlock을 대입해 prevBlock의 값을 갱신시키고,
totalPrevBlock에 갱신된 prevBlock의 값을 더해준다
마지막으로 nowBlock의 크기는 2^갱신된 횟수 count * 3이 되며 count의 값도 증가시켜준다
이렇게 반복문이 끝나게 되면 각 값이 구해지는데, nowBlock - (t - totalPrevBlock) + 1의 값이 현재 카운트다운 값이 되므로 이 값을 return 한다
visual studio같은 프로그램으로 천천히 디버깅 해보면서 풀면 어떻게든 풀 수 있는 문제다
'코딩테스트 해커랭크 > Algorithms -Easy' 카테고리의 다른 글
| [HackerRank/C++] Super Reduced String (0) | 2023.02.08 |
|---|---|
| [HackerRank/C++] Big Sorting (0) | 2023.02.08 |
| [HackerRank/C++] Happy Ladybugs (0) | 2023.02.08 |
| [HackerRank/C++] Manasa and Stones (0) | 2023.02.08 |
| [HackerRank/C++] Cavity Map (0) | 2023.02.08 |