숫자 카운터를 어떤 알고리즘으로 해야할지 몰라서요

조회수 1835회

숫자를 증가시키는 카운터를 만들려고 합니다.

선거개표 현황과 유사한 형태의 카운터를 만드려고 합니다.

예를 들어서 15000 이란 숫자를 카운터 하는데요.

15000이 계속 카운터가 되는 것이 아니라 24시간 동안 숫자가 증가 되게 하는것 입니다.

그래서 7초마다 증가를 해서 저녁 12시 쯔음에 15000이 도달하도록이요..

7초마다 증가할때는 올라가는 숫자는 일정하지 않도록 하면서요 ..

그리고 한가지 더는 여러 사람이 확인을 할수 있어서 다른곳에서 다른 시간에 접속을 하더라도

동일한 숫자 카운터가 되도록 하는 겁니다.

최종 도달해야하는 숫자는 매일 달라집니다.

그리고 카운터 시작은 매일 00시에 시작을 해서 아침 9시 접속을 하면 0에서 부터 시작이 아니라

00시에서 9시까지의 카운터를 계산을 해서 시작이 되어지도록 해야합니다.

정리를 해보면

1) 매 7초마다 숫자가 증가하여 최종 도달 숫자까지 가는데 24시간이 걸리게 한다.

2) 최종 도달 숫자는 매일 달라진다.

3) 7초마다 증가되는 숫자도 달라야 한다.

4) 여러곳에서 확인을 하여도 같은 카운터를 보여줘야 한다.

5) 카운터 시작은 매일 00시를 기준으로 시작이 된다.

아무리 고민해도 어떤 알고리즘으로 해야할지 몰라서요 ㅠ.ㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 어디에 쓰려는 기능인지 잘 감이 안오네요. 다른 곳에서 접속을 하더라도 동일한 숫자가 보인다는건... 웹페이지여야 한다는건가요? 무슨 용도인지 배경 설명이 필요합니다. 정토드 2016.6.1 12:21
  • 네에 웹페이지로 표시하려고 합니다. 하루 전날 웹페이지 접속자 수를 여러 상황실에서 보여주려고 합니다. 한번에 전체 숫자를 보여주는 것보다 시간에 흐름에 따라서 접속자 수가 증가되도록 보여주고 싶어서요 알 수 없는 사용자 2016.6.1 13:03

1 답변

  • 7초마다 굳이 숫자를 업데이트할 필요는 없을것 같습니다. 웹페이지라면 사용자에게 페이지 요청이 있을때 마다만 숫자를 업데이트 하면 더 좋을것 같습니다.

    • last_count: 지난번에 사용자에게 노출한 숫자
    • last_update_time: 지난번에 사용자에게 노출한 시간
    • target_count: 오늘 달성해야 하는 목표 사용자 수

    와 같이 3개의 값은 DB에 저장하고 있으면 되겠네요.

    (1) 사용자로부터 요청이 지난번 요청으로 부터 7초 이내라면 지난번 값을 그대로 주고 (2) 그렇지 않으면 최종 target_count를 달성하기 위해서 1초당 얼마씩 증가해야 하는지를 계산(increment_per_second)를 구한 다음에 지난번 업데이트로 부터 몇초나 지났는지(elapsed_time)를 가지고 표시할 숫자를 변경하면 되겠습니다.

    import datetime
    
    def user_count():
        # last_count, last_update_time, taget_count는 DB등에서 읽어와서 사용하세요.
        # 아래의 값은 임의의 값을 넣은겁니다.    
        last_count = 10
        last_update_time = datetime.datetime.now().replace(hour=1)
        target_count = 10000
    
        elapsed_time = (datetime.datetime.now()-last_update_time).total_seconds()
        if elapsed_time <7 :
            return last_count
        increment_per_second  =(target_count-last_count)/(datetime.datetime.now().replace(hour=23,minute=59,second=59) - last_update_time).total_seconds()
    
        #여기서 increment_per_second를 적당히 랜덤하게 변경
    
        #last_count와 last_update_time은 db에도 업데이트 되어야 함
        last_count = last_count + elapsed_time * increment_per_second
        last_update_time = datetime.datetime.now()
    
        return last_count
    

    매일 target_count를 변경하는 로직은 생략했습니다.

    • 감사합니다. 해주신것을 조금 변경해서 잘 사용하였습니다. ^^ 알 수 없는 사용자 2016.6.8 16:08

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)