💻알고리즘

[LeetCode] 933. Number of Recent Calls

김 진 하 2025. 9. 17. 20:46

문제

RecentCounter(): 최근 요청 수를 0으로 초기화합니다.int ping(int t): t 밀리초 시점에 새로운 요청을 추가합니다. 그리고 최근 3000밀리초 동안 발생한 요청의 수(새 요청 포함)를 반환합니다. 즉, 요청이 [t - 3000, t] 구간(양쪽 모두 포함)에 몇 번 발생했는지 반환해야 합니다.각 ping 호출의 t 값은 이전 호출보다 항상 더 큰 값을 갖는 것이 보장됩니다.

호출 예시
RecentCounter rc = new RecentCounter();
rc.ping(1); // 반환값: 1
rc.ping(100); // 반환값: 2
rc.ping(3001); // 반환값: 3
rc.ping(3002); // 반환값: 3
각 호출마다 최근 3000밀리초 내의 요청 수를 반환합니다.

이렇게 최근 3000밀리초 범위 내 요청 개수를 카운트해주는 클래스를 설계하면 됩니다.

 

아이디어

class RecentCounter {
    Queue<Integer> que;

    public RecentCounter() {
        que = new ArrayDeque<>();
    }
    
    public int ping(int t) {
        que.add(t);

        for (Integer i : que) {
            if (i < t - 3000) {
                que.remove();
            } else {
                break;
            }
        }

        return que.size();
    }
}

 

너무 Queue 사용에 집착한건가 싶음

ArrayDeque라서 메모리 사용면에서는 기대한 것보다 높아서 맘에 드는데 런타임 성능은 맨 꼭대기가 아니라 살짝 욕심나네

 

그래도 후에 들어오는 t 값이 계속 높은 값이라 선입선출이 중요하다 생각했어서 Queue 사용을 채택함

int cnt 변수를 사용해서 cnt++ 하자니 계속 높은 값이 들어오면 이전 값들은 비교할 필요도 없어서 삭제하는 방법으로