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