프로그래머스 [같은 숫자는 싫어] - 보충

JH.P·2022년 7월 23일
  • 아래와 같이 작성을 하면 시간 초과로 효율성 테스트 케이스를 통과하지 못한다.
    const stack = []
    
    for(let i in arr) {
        if(stack[stack.length - 1] !== arr[i]) {
            stack.push(arr[i])
        } 
    }
  • 하지만 아래처럼 수정을 하면, 효율성 테스트를 모두 통과한다.
	const stack = []
    
    for(let i = 0; i < arr.length; i++) {
        if(stack[stack.length - 1] === arr[i]) {
            continue
        }
        stack.push(arr[i])
    }

어떤 차이점이 존재하는 것일까?

  • 우선 첫번째 경우, for in 구문을 사용하게 되면, 배열을 순회하기 위해 이터레이터를 호출하게 된다.(순회 중 뒤에 어떤 원소가 올지 알 수가 없기 때문에 이터레이터를 통한 순회가 필요하다.) 예를 들어 5개의 원소를 순회한다고 하면, 다음 값이 무엇인지 알기 위해 이터레이터를 총 5번 호출하게 되고 next().value를 실행한다. 그리고 순회가 모두 완료되면 호출하지 않게 된다. 이때 이터레이터를 5번 호출로 인한 오버로드가 발생하여 시간이 초과된 것이다.
  • 두번째 같은 경우에는 i라는 변수를 메모리에 할당시키고, 1씩 증가시키며 배열의 인덱스에 순차적으로 접근한다. 따라서 위와 같은 오버로드가 발생하지 않게 된다.

그럼 이터레이터와 제너레이터의 존재 의의는?

  • 존재 의의 중 하나는 함수형 프로그래밍을 위한 것이다. 여러 줄로 된 코드를 깔끔한 하나의 코드로 작성하는 것이 가능하기 때문이다.
    ex) 배열의 map,filter 함수는 이터레이터를 호출하게 된다.
profile
꾸준한 기록

0개의 댓글