Map 객체

송한솔·2023년 5월 21일
0

자바스크립트

목록 보기
8/10

Map객체의 장점

  1. Map 객체는 내부적으로 효율적인 데이터 검색 알고리즘을 사용하여 빠른 검색 속도를 제공합니다.
    특정 키를 사용하여 값을 검색하는 경우, Map 객체는 평균적으로 상수 시간(O(1))에 검색을 수행합니다. 이는 많은 데이터를 가지고 있는 경우에도 빠른 검색이 가능하다는 장점입니다.

  2. 키-값 쌍 저장: Map 객체는 키(Key)와 값(Value)의 쌍을 저장하는 데 사용됩니다. 이는 데이터를 구조화하고 효율적으로 관리할 수 있도록 도와줍니다. 키와 값은 임의의 데이터 형식일 수 있으며, 다양한 타입의 데이터를 맵에 저장할 수 있습니다.

  3. 순서 보장: Map 객체는 키-값 쌍이 삽입된 순서를 보장합니다. 이는 맵에 저장된 데이터의 순서가 유지되어 순회할 때 예측 가능한 동작을 제공합니다. 일반적인 객체(Object)의 속성 순서는 보장되지 않으므로, 순서가 중요한 경우에는 Map 객체를 사용하는 것이 좋습니다.

  4. 크기 확인 및 반복 처리: Map 객체는 size 속성을 사용하여 저장된 키-값 쌍의 개수를 확인할 수 있습니다. 또한, for...of 루프를 사용하여 맵의 키-값 쌍을 순회할 수 있습니다. 이는 맵의 데이터를 처리하고 조작하는 데 유용합니다.

  5. 키의 중복 제거: Map 객체는 키의 중복을 허용하지 않습니다. 즉, 동일한 키로 여러 번 값을 저장하더라도 마지막에 저장된 값만 유지됩니다. 이는 중복된 데이터를 처리하거나 유일한 키-값 쌍을 유지해야 할 때 유용합니다.


예제

// 문제 설명
얀에서는 매년 달리기 경주가 열립니다.
해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다.
예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때,
해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다."soe" 선수가 1, "mumu" 선수가 2등으로 바뀝니다.

선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와
해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때,
경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아
return 하는 solution 함수를 완성해주세요.

// 제한사항
5 ≤ players의 길이 ≤ 50,000
players[i]는 i번째 선수의 이름을 의미합니다.
players의 원소들은 알파벳 소문자로만 이루어져 있습니다.
players에는 중복된 값이 들어가 있지 않습니다.
3 ≤ players[i]의 길이 ≤ 10
2 ≤ callings의 길이 ≤ 1,000,000
callings는 players의 원소들로만 이루어져 있습니다.
경주 진행중 1등인 선수의 이름은 불리지 않습니다.

// 입출력 예
players
["mumu", "soe", "poe", "kai", "mine"]
callings
["kai", "kai", "mine", "mine"]
result
["mumu", "kai", "mine", "soe", "poe"]

// 입출력 예 설명
4등인 "kai" 선수가 2번 추월하여 2등이 되고
앞서 3, 2등인 "poe", "soe" 선수는 4, 3등이 됩니다.

5등인 "mine" 선수가 2번 추월하여
4, 3등인 "poe", "soe" 선수가 5, 4등이 되고 경주가 끝납니다.

1등부터 배열에 담으면 ["mumu", "kai", "mine", "soe", "poe"]이 됩니다.

// 주어진 함수
function solution(players, callings) {
    var answer = [];
    return answer;
}

// 풀이1 - 시간 초과로 인한 오류
function solution(players, callings) {
    for(var i = 0; i < callings.length; i++){
        var checkNumber = players.indexOf(callings[i]);
        if(checkNumber > -1){
            players.splice(checkNumber, 1);
            players.splice(checkNumber-1, 0, callings[i]);  
        }
    }
    return players;
}
// 풀이2 - 시간 초과
function solution(players, callings) {
    for(var i = 0; i < callings.length; i++){
        if(players.includes(callings[i])){
            var checkNumber = players.indexOf(callings[i]);
            players.splice(checkNumber, 1);
            players.splice(checkNumber-1, 0, callings[i]);  
        }
    }
    return players;
}

//풀이 3 Map 객체를 이용한 풀이방식
function solution(players, callings) {
    let playerMap = new Map(); // Map 객체임을 선언
    for (var i = 0; i < players.length; i++) {
      playerMap.set(players[i], i); // players[i] = i 형식으로 playerMap객체 set
    }
    for (var i = 0; i < callings.length; i++) {
      // has는 ()안의 내용이 받은 변수에 존재유무를 확인하는 메서드(Map에서)
      if (playerMap.has(callings[i])) {
        //get은 ()안에 내용물에 맞는 값을 반환하는 메서드(Map에서)
        let index = playerMap.get(callings[i]);        
        if (index > 0) {
          playerMap.set(players[index - 1], index);
          playerMap.set(callings[i], index - 1);
          [players[index], players[index - 1]] = [players[index - 1], players[index]];
        }
      }
    }
  
    return players;
}

풀이 3을 보면 Map객체에 set, has, ge을 볼 수 있는데요
.set()
Map객체.has(key, value)의 사용법을 가지고 있으며
Map객체 안에 원하는 키-값을 넣는데 사용합니다.

.has()
Map객체.has(item)의 괄호 안에 특정 key값(item)이 들어갔을 때
객체의 key값에 item이 존재하는지 유무를 확인해주는 메서드입니다.
true / false값을 반환합니다.

.get()
Map객체.get(item)일때 괄호 안의 특정 키 값(item)이 들어갔을때
해당 key의 value값을 반환하는 메서드입니다
예시를 들면

var players = ["mumu", "soe", "poe", "kai", "mine"];
let playerMap = new Map(); // Map객체임을 선언
for (var i = 0; i < players.length; i++) {
  playerMap.set(players[i], i); // playerMap에 키 => 값을 넣어줌
}
// 결과
// {"mumu" => 0}
// {"soe" => 1}
// {"poe" => 2}
// {"kai" => 3}
// {"mine" => 4}

이때 mine(key)의 값은 4(value)이며

  console.log(playerMap.get("mine")); // 4

이렇게 입력해보면 4가 출력되는것을 확인할 수 있습니다,
보다보면 오해할 수도 있는데
이 경우에 set할 때부터 for문의 i를 통해 인덱스번호처럼 넣었지만
해당값은 인덱스번호가 아니라 value값에 들어가는 모든 값입니다.

0개의 댓글