<html>
<head>
<meta charset="UTF-8">
<title>출력결과</title>
</head>
<!-- N개의 문자열이 입력되면 중복된 문자열은 제거. (원래의 입력순서를 유지). -->
<body>
<script>
let arr = ["good", "time", "good", "time", "student"];
function solution(arr) {
let set = new Set(arr)
return [...set];
}
function solution2(arr) {
const set = new Set();
arr.forEach(el => set.add(el));
return [...set];
}
function solution3(arr) {
let answer = arr.filter((el, i) => arr.indexOf(el) === i)
return answer;
}
console.log(solution(arr));
</script>
</body>
</html>
solution과 solution2의 차이는
두번째의 방법이 메모리 소모가 더 적습니다.
solution 함수는
set 자체에는 중복이 제거된 상태의 Set 객체가 들어가있지만
new Set으로 객체를 생성할때 중복을 포함한 요소가 Set 객체에 추가가 되어
배열 전체를 사용하기 때문에, 중복 제거전부터 불필요한 메모리를 소모합니다.
('중복이 제거된 배열', '중복 포함 배열' 두 가지의 배열이 메모리에 저장됩니다)
solution2의 경우는 빈 Set객체를 생성후 forEach를 통해 하나씩 추가합니다
이 경우 Set 객체 자체에는 할당된 배열이 없으며, 배열의 요소를 하나씩 Set에 추가하면서 Set 객채의 특성을 이용해
중복을 제거하는 함수입니다. 이 경우 배열의 중복 개수 크기에 상관없이 필요한 메모리만 사용합니다.
다만 forEach는 새로운 배열을 생성하지는 않지만, 반복문을 돌며 배열의 요소를 처리하는데 메모리를 사용합니다.
(그래도 1번보다는 좋다!)
크기가 작은 배열의 중복제거의 경우, 두 함수는 큰 차이를 보이지 않지만, 배열의 크기가 커질경우 성능차이가 발생합니다.
(2번이 효율적)
solution3의 경우, filter 함수가 새로운 배열을 반환하기 때문에 메모리 양이 더 많아집니다.
중복이 포함된 배열과 같은 크기를 가지고있어 메모리 사용량이 증가합니다.
filter 함수 내에서 새로운 배열을 생성하기 때문에 중복을 제거한 새로운 배열과 원래의 배열 두 가지가 메모리에 할당됩니다.
(따라서 1번과 마찬가지로 메모리 사용량이 높습니다)