Dandy Now!
  • [레벨1][자바스크립트] 숫자 짝궁
    2023년 07월 17일 23시 25분 09초에 업로드 된 글입니다.
    이 글은 2023년 09월 16일 01시 58분 06초에 마지막으로 수정되었습니다.
    작성자: 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
    반응형
    댓글