본문 바로가기
개발/Javascript

[js] Set, Map의 비교, 예제

by 코딩하는 갓디노 2024. 9. 21.

Set

  • 중복되지 않은 값(value) 들을 저장하는 컬렉션
  • 요소는 고유해야 하며, 중복된 값은 저장되지 않습니다.
  • 값을 빠르게 추가, 삭제, 탐색

Map

  • 키(key)와 값(value) 쌍으로 이루어진 데이터 구조
  • 각 키는 고유해야 하지만, 값은 중복될 수 있습니다.
  • 키를 기준으로 값을 빠르게 검색, 추가, 삭제

Set과 Map 비교

특징 Set Map
저장 방식  중복되지 않은 값만 저장 키-값 쌍으로 저장
중복 허용 여부 중복된 값 저장 불가 키는 중복될 수 없으나 값은 중복 가능
값 접근 방법 인덱스가 없고, 값을 직접 확인 키를 통해 값을 검색
순서 보장 여부 삽입된 순서 유지 삽입된 순서 유지
메소드 add(), has(), delete() set(), get(), has(), delete()

Set 예제

1. 중복 제거

배열에서 중복된 값을 제거합니다.

function removeDuplicates(arr) {
    return [...new Set(arr)];
}

const arr = [1, 2, 3, 3, 4, 4, 5];
const uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // [1, 2, 3, 4, 5]

2. 교집합 찾기

두 배열의 교집합을 구합니다.

function findIntersection(arr1, arr2) {
    const set1 = new Set(arr1);
    return arr2.filter(item => set1.has(item));
}

const set1 = new Set([1, 2, 3, 4]);
const set2 = new Set([3, 4, 5, 6]);
const intersection = [...set1].filter(item => set2.has(item));
console.log(intersection); // [3, 4]

3. 차집합 구하기

한 배열에서 다른 배열에 없는 값을 구합니다.

function difference(arr1, arr2) {
    const set2 = new Set(arr2);
    return arr1.filter(item => !set2.has(item));
}

4. 중복된 값 찾기

배열에서 중복된 값을 찾아 반환합니다.

function findDuplicates(arr) {
    const set = new Set();
    const duplicates = new Set();
    for (const item of arr) {
        if (set.has(item)) {
            duplicates.add(item);
        } else {
            set.add(item);
        }
    }
    return [...duplicates];
}

5. 유일한 값 확인

배열이 모두 유일한 값으로만 이루어졌는지 확인합니다.

function allUnique(arr) {
    return new Set(arr).size === arr.length;
}

const arr = [1, 2, 3, 4, 5];
const hasUniqueValues = new Set(arr).size === arr.length;
console.log(hasUniqueValues); // true

6. 배열에서 특정 값 제거

특정 값을 배열에서 제거합니다.

function removeSpecificValue(arr, value) {
    const set = new Set(arr);
    set.delete(value);
    return [...set];
}

7. 합집합 구하기

두 배열의 합집합을 구합니다.

function union(arr1, arr2) {
    return [...new Set([...arr1, ...arr2])];
}

8. 배열 내의 중복된 요소 개수 세기

배열에서 중복된 요소의 개수를 셉니다.

function countDuplicates(arr) {
    const set = new Set();
    let duplicates = 0;
    for (const item of arr) {
        if (set.has(item)) {
            duplicates++;
        } else {
            set.add(item);
        }
    }
    return duplicates;
}

Map 예제

1. 문자 빈도 카운팅

주어진 문자열에서 각 문자의 빈도를 카운팅합니다.

function countCharFrequency(str) {
    const map = new Map();
    for (const char of str) {
        map.set(char, (map.get(char) || 0) + 1);
    }
    return map;
}

const result = countCharFrequency("hello");
console.log(result); // Map { 'h' => 1, 'e' => 1, 'l' => 2, 'o' => 1 }

2. 두 배열의 매핑

두 배열을 매핑하여 각 값이 짝을 이루는지 확인합니다.

function isMappedCorrectly(arr1, arr2) {
    if (arr1.length !== arr2.length) return false;
    const map = new Map();
    for (let i = 0; i < arr1.length; i++) {
        if (map.has(arr1[i])) {
            if (map.get(arr1[i]) !== arr2[i]) return false;
        } else {
            map.set(arr1[i], arr2[i]);
        }
    }
    return true;
}

const arr1 = ['a', 'b', 'c'];
const arr2 = [1, 2, 3];
console.log(isMappedCorrectly(arr1, arr2)); // true

3. 값의 중복 제거 후 마지막 값 찾기

중복된 키를 가진 값 중 마지막 값을 저장하고 찾습니다.

function getLastValue(arr) {
    const map = new Map();
    arr.forEach(([key, value]) => {
        map.set(key, value);
    });
    return [...map.values()].pop();
}

const arr = [['a', 1], ['b', 2], ['a', 3]];
console.log(getLastValue(arr)); // 3

4. 단어 길이로 그룹핑

단어들의 길이에 따라 그룹으로 나눕니다.

function groupByWordLength(words) {
    const map = new Map();
    words.forEach(word => {
        const len = word.length;
        if (!map.has(len)) {
            map.set(len, []);
        }
        map.get(len).push(word);
    });
    return map;
}

const words = ['apple', 'banana', 'pear', 'peach', 'plum'];
console.log(groupByWordLength(words));
// Map { 5 => ['apple', 'peach'], 6 => ['banana'], 4 => ['pear', 'plum'] }

5. 연속된 요소의 개수 세기

배열에서 연속된 요소의 개수를 카운트합니다.

function countConsecutive(arr) {
    const map = new Map();
    let count = 1;
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] === arr[i - 1]) {
            count++;
        } else {
            map.set(arr[i - 1], count);
            count = 1;
        }
    }
    map.set(arr[arr.length - 1], count);
    return map;
}

const arr = [1, 1, 2, 2, 2, 3];
console.log(countConsecutive(arr)); // Map { 1 => 2, 2 => 3, 3 => 1 }

6. 이름으로 나이 찾기

사람의 이름과 나이를 매핑하여 이름으로 나이를 찾습니다.

function findAge(name, people) {
    const map = new Map(people); // [['Alice', 25], ['Bob', 30]]
    return map.get(name) || 'Not found';
}

const people = [['Alice', 25], ['Bob', 30]];
console.log(findAge('Alice', people)); // 25
console.log(findAge('Charlie', people)); // Not found

7. 평균 점수 계산

학생들의 이름과 점수를 매핑하고 평균을 구합니다.

function averageScore(students) {
    const map = new Map(students); // [['Alice', 90], ['Bob', 85]]
    const total = [...map.values()].reduce((a, b) => a + b, 0);
    return total / map.size;
}

const students = [['Alice', 90], ['Bob', 85], ['Charlie', 80]];
console.log(averageScore(students)); // 85

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글