[12일차] 알고리즘을 해결하는 단계 2

저요·2022년 10월 4일

2022 100th day challenge

목록 보기
12/97
post-thumbnail

서론

어제까지는 4단계까지 문제 해결/단순화까지 했다 코드를 작성하고 동작하는 것으로 만족해도 괜찮지만, 더 나은 성능의 효율적인 코드를 만들기 위해서는 이 다음이 중요하다. 나중에 면접을 볼 때에도 이 부분은 중요하다니 개발자의 기본덕목이라고도 할 수 있다. 오늘은 마지막 단계인 되돌아보기와 리팩터링을 해 보도록 하겠다. 렛츠 기릿~!

본론

5단계 되돌아보기와 리팩토링

function solution(participant, completion) {
    var answer = '';
    var checkMap = new Map();
    
    participant.forEach(data=>{
        if(checkMap.get(data)!=null){
            checkMap.set(data, checkMap.get(data)+1);    
        }else{
            checkMap.set(data, 1);
        }
    });
    
    completion.forEach(data=>{
       checkMap.set(data, checkMap.get(data)-1);
    });
    
    participant.forEach(data=>{
        if(checkMap.get(data) >= 1){
            answer = data;
        }
    });
    
    return answer;
}

다음과 같이 내 나름대로의 결과를 냈다. 일단 forEach문을 이용해서 O(n)의 복잡도의 코드를 완성했다. 효율성과 정확성도 만점을 받아서 100점의 코드를 냈지만 여기서 멈추지 말고 다른 방법은 없었는지 우리는 한 번 더 생각을 해 보아야 한다.

forEach를 너무 많이 쓴거 같은데 forEach를 사용하지 않고 다른 방식으로 풀어낼 수는 없던 것인가. 코드도 너무 길다고 생각이 된다 짧게 줄일 수 있는 방법이 있을텐데... 하지만 혼자서 생각하면 잘 떠오르지 않는다. 여기서 다른 사람의 풀이를 한 번 살펴보는 것이 도움이 된다.

다른 사람의 풀이를 본 결과 이 과정을 매핑한 뒤 find를 사용해 한 줄로 축약한 코드를 발견하였다.. 가독성은 떨어지지만 이렇게까지 축약할 수 있다는 것을 보니 놀라웠고 아직 공부가 더 필요함을 느꼈다.

참고

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

profile
웹개발

0개의 댓글