Dandy Now!
  • [레벨1][자바스크립트] 숫자 짝궁
    2023년 07월 17일 23시 25분 09초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    https://school.programmers.co.kr/learn/courses/30/lessons/131128?language=javascript 

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    1. 리팩토링 전

    function solution(X, Y) {
      let xArr = [...X];
      let yArr = [...Y];
      const xObj = xArr.reduce((acc, curr) => {
        acc[curr] === undefined ? (acc[curr] = 1) : (acc[curr] += 1);
        return acc;
      }, {});
      const yObj = yArr.reduce((acc, curr) => {
        acc[curr] === undefined ? (acc[curr] = 1) : (acc[curr] += 1);
        return acc;
      }, {});
    
      const set1 = new Set(xArr);
      const set2 = new Set(yArr);
      const intersection = [...set2].filter((v) => set1.has(v));
    
      let answer = "";
      intersection.forEach((key) => {
        const count = Math.min(xObj[key], yObj[key]);
        for (let i = 0; i < count; i++) {
          answer += key;
        }
      });
    
      if (!answer) return "-1";
    
      answer = [...answer].sort((a, b) => b - a).join("");
    
      return answer.slice(0, 1) === "0" ? "0" : answer;
    }

     

    2. 리팩토링 후

    function solution(X, Y) {
      const countOccurrences = (arr) => {
        return arr.reduce((acc, curr) => {
          acc[curr] = (acc[curr] || 0) + 1;
          return acc;
        }, {});
      };
      const xObj = countOccurrences([...X]);
      const yObj = countOccurrences([...Y]);
    
      const findIntersection = (obj1, obj2) => {
        return Object.keys(obj1).filter((key) => obj2[key]);
      };
    
      const intersection = findIntersection(xObj, yObj);
    
      let answer = "";
      intersection.forEach((key) => {
        const count = Math.min(xObj[key], yObj[key]);
        answer += key.repeat(count);
      });
    
      if (!answer) return "-1";
    
      answer = [...answer].sort((a, b) => b - a).join("");
    
      return answer.startsWith("0") ? "0" : answer;
    }

     

    리팩토링된 코드가 성능 면에서 앞의 코드보다 더 효율적인 이유:

    1) 중복 코드 제거: 리팩토링된 코드에서는 `countOccurrences()` 함수를 통해 중복 코드를 제거하였습니다. 이 함수를 사용하여 배열의 요소를 순회하면서 요소의 개수를 카운트하기 때문에 불필요한 반복이 제거되어 효율적인 처리가 가능합니다.

    2) 객체의 속성 활용: `findIntersection()` 함수에서는 객체의 속성을 활용하여 교집합을 계산하였습니다. 객체의 속성은 직접 접근하여 확인하는 것이 `Set` 객체를 사용하는 것보다 더 효율적입니다.

    3) 문자열 처리 개선: 리팩토링된 코드에서는 `repeat()` 메서드를 사용하여 문자열을 반복하여 추가하였습니다. 이를 통해 반복문을 사용하는 대신 문자열을 한 번에 추가하므로 처리 속도가 향상됩니다.

    4) 불필요한 변수 사용 제거: 리팩토링된 코드에서는 불필요한 변수 사용을 제거하였습니다. 예를 들어, `xArr`와 `yArr` 배열을 사용하지 않고 직접 `X`와 `Y`를 활용하였습니다. 이는 메모리 사용과 처리 시간을 절약하는 데 도움이 됩니다.

    5) 조건문 개선: 리팩토링된 코드에서는 `startsWith()` 메서드를 사용하여 `answer` 문자열이 `'0'`으로 시작하는지 확인하는 조건문을 개선하였습니다. 이를 통해 문자열을 비교하는 단순한 조건 비교로 처리되므로 성능이 향상됩니다.

    728x90
    반응형
    댓글