[프로그래머스] [1차] 다트게임 - if문과 switch문 알아보기

2022. 10. 23. 01:22Study/Algorithm

    개요

    https://school.programmers.co.kr/learn/courses/30/lessons/17682

    지난 주 스터디 문제로 프로그래머스  Level1의 [1차] 다트 게임을 풀었다. 나는 계산기 문제를 switch문제로 풀던 기억이 나서 이를 응용했고, 다른 스터디원분들은 주로 if문을 이용하셨다. 리뷰과정에서 switch문의 성능에 대한 리뷰를 주셔서, 이를 계기로 if문과 switch문의 성능에 대해 찾아보게 되었다. 아래는 나의 풀이이다.

     

    function solution(dartResult) {
      let num = 0;
      let sign = "";
    
      let scores = [];
    
      for (let i = 0; i < dartResult.length; i++) {
        // 정규표현식으로
        let regExp = /[0-9]/;
        if (regExp.test(dartResult[i])) {
          num = +dartResult[i - 1] === 1 ? 10 : +dartResult[i]; // 그 전이 1이면 10점으로
        } else {
          sign = dartResult[i];
          switch (sign) {
            case "S": // 1제곱
              scores.push(Math.pow(num, 1));
              break;
            case "D": // 2제곱
              scores.push(Math.pow(num, 2));
              break;
            case "T": // 3제곱
              scores.push(Math.pow(num, 3));
              break;
            case "*": // 이전과 현재 수를 2배 곱함.
              if (scores.length -2 >= 0) {
                scores[scores.length -2] *= 2;
              }
              scores[scores.length -1] *=2;
              break;
            case "#": // 해당 점수를 마이너스함.
              scores[scores.length-1] *= -1;
              break;
          }
        }
      }
      return scores.reduce((acc,cur)=> acc += cur);
    }

    결론

    if-else문은 조건문의 개수만큼 O(N)의 시간복잡도를 갖게 되어서 성능에 단점이 있고, Switch문은 case의 개수마다 jump-table을 차지해서 메모리에 단점이 있다! if문과 switch문은 시간복잡도와 공간 복잡도의 문제이다! 하지만 컴파일러가 최적화일 때는 switch문이 유리하며, 보통 3개일 때까지는 if, else가 빠르고 그 이상이면 switch, case문을 사용하는 게 효율적이라고 한다! 근데 둘 중 어느 것을 사용하든 전체 프로그래밍 성능에 치명적인 영향을 끼치지는 않는다고 한다!

    if문과 Switch문 비교

    - if문은 조건이 만족하면 실행/만족하지 않으면 무시!
    - switch문은 입력된 값에 따라 해당 case로 점프 방식!


    If문의 성능을 높이는 방법

    - 가장 많이 실행되는 값을 순서대로 넣어준다.
    - If문 안에 다른 분기를 넣고 내부에서 다시 if-else문으로 써준다.

    Switch문의 성능을 높이는 방법

    - 순차적으로 작성한다.
    - case를 정수 형태의 표현식을 사용하는 것이 좋다.
    (연산이 들어가면 순차적이 아니라 쓰여진 순서대로 표현식 평가)

    참고 자료

    https://limjs-dev.tistory.com/79
    https://hee96-story.tistory.com/94
    https://thinkpro.tistory.com/132
    https://cmykrgb.tistory.com/entry/ifelse-VS-switch
    https://chucoding.tistory.com/83
    https://kldp.org/node/62262

    맨 위로
    // //