[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같은 프로그램으로 천천히 디버깅 해보면서 풀면 어떻게든 풀 수 있는 문제다