강의로 돌아가기
howdyfrom2019

[JS] 시간초과나는 분들 팁 (스포 o)

index 별로 slice해서 끊은 다음에 new Set() 이렇게 해주면 너무 좋겠으나...
topping이 최대 1,000,000 개라는 제한 조건이 있기 때문에,
이 문제는 반복문의 중첩이 1회 이상으로 넘어가면 안됩니다. slice나 set도 결국엔 O(n)이니까요

결론적으로 루프 밖에서 내꺼랑 동생의 토핑을 세어주면 되겠습니다.
저는 해시맵이 편해서 저걸로 갯수 세어줬는데 배열로 해도 아무 상관없을 것 같네요.

루프 돌다가 처음 본 요소(visited = false)라면 내껄 1 늘리고, 
duplicated가 0이 되면, 동생껄 1 줄여주면 되겠습니다.
작성중인 코드―solution.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const solution = (topping) => {
    const elementNumber = new Map();
    topping.forEach((v) => {
        if (elementNumber.has(v)) {
            const val = elementNumber.get(v);
            val.duplicated++;
            elementNumber.set(v, val);
        } else {
            elementNumber.set(v, { duplicated: 1, visited: false });
        }
    });
    let result = 0;
    let [me, brother] = [0, elementNumber.size];
    for (let i = 0; i < topping.length; i++) {
        const val = elementNumber.get(topping[i]);
        if (val.duplicated >= 1) {
            val.duplicated--;
            if (val.duplicated === 0) brother--;
        }
        if (!val.visited) { val.visited = true; me++; }
        elementNumber.set(topping[i], val);
        if (me === brother) result++;
    }

    return result;
}


1 개의 답변
송대겸

감사합니다. 문제 풀때 시간 초과가 많이 났었는데 덕분에 문제 보는법도 배워갑니다!

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.