TIL 2023 10 01

김민준·2023년 10월 1일

코드테스트

목록 보기
4/37

프로그래머스

프로그래머스

없는 숫자 더하기

나의 풀이

function solution(numbers) {
    var answer = 45
    const length = numbers.length
    
    for (let i = 0 ; i < length ; i++ ){
        answer -= numbers[i]
    }
    
    return answer;
}

0부터 9까지의 수를 다 합치면 45이고 요소들의 값만큼 빼준다.
(1+9)×92=45\frac{(1+9)\times9}{2} = 45

다른 사람의 풀이 1

function solution(numbers) {
    return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
}

45는 나와 같은 방법으로 구하였지만 그때그때 빼는것이 아니라 다 더한 다음에 빼는것같다.

다른 사람의 풀이 2

function solution(numbers) {
    let answer = 0;

    for(let i = 0; i <= 9; i++) {
        if(!numbers.includes(i)) answer += i;
    }

    return answer;
}

반대로 i값이 numbers[i]에 속했는지 확인하고 더하는 방법이다.

속도 비교

아마도 2가 제일 느릴 것이다. 그렇게 생각한 이유는 조건이 더 복잡하기 때문이다.
특히 나와 1번 솔루션은 몇까지의 숫자가 범위인지 안다면 (1+n)×n2\frac{(1+n)\times n}{2} 으로 연산하나를 미리 해둘 수 있다는 장점이 있다.

async function runSolutionWithTiming(solutionFn, number1, number2) {
  const startTime = new Date();
  for (let i = 0; i < 10000000; i++) {
    await solutionFn(number1);
    await solutionFn(number2);
  }
  const endTime = new Date();
  const executionTime = endTime - startTime;

  console.log(`${solutionFn.name} 실행 시간: ${executionTime}ms`);
}

async function main() {
  const number1 = [0, 1, 2];
  const number2 = [1, 9, 3, 5];

  await runSolutionWithTiming(solution0, number1, number2);
  await runSolutionWithTiming(solution1, number1, number2);
  await runSolutionWithTiming(solution2, number1, number2);

위와같이 배열을 두개 만들어놨다.

예상대로 솔루션2가 제일 느리다.
이유를 예상해보자면

나의 솔루션 : answer와 i외의 값은 계산에 사용된 후에 없어진다.
솔루션 1 : 나와 발상은 비슷하지만 배열의 값을 계속 기억한다.
솔루션 2 : 그때그때 값을 부정연산자로 비교해서 오래걸린다.

profile
node 개발자

0개의 댓글