안녕하세요

프로그래머스 JS [완주하지 못한 선수]★★ / 해시테이블, map 본문

프로그래머스/Lv.1

프로그래머스 JS [완주하지 못한 선수]★★ / 해시테이블, map

sakuraop 2022. 10. 1. 16:21

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

해시 문제이기 때문에 해시에 대해서도 알아봅니다.

 

해시테이블은 kep와 value로 구성되어 객체와 기능이 비슷합니다. 객체는 key로 string만이 가능하지만,

해시 자료형 : key로 string, number, function, object 모두 가능합니다.

 

let map = new Map(); 으로 선언을 합니다.

 

map.set() 으로 키(key)와 값(value)을 삽입합니다.

map.set(str, 1) : 문자열에 1을 할당

map.set(0, 2) : 숫자 0에 1을 할당

map.set(obj, 3) : 객체에 1을 할당

map.set(function, 4) : 함수에 1을 할당

 

 

map.get()으로 값을 얻습니다.
map.get(str); // 1
map.get(0); // 2
map.get('none'); // undefined  존재하지 않을 경우 undefined를 반환합니다.

 

객체의 경우에는 객체를 담은 변수를 입력해주어야 합니다.

map.get({ a: 1 }); // undefined, obj의 값이 { a: 1 } 이라 할지라도, 다른 객체로 인식합니다. 

(객체에는 고유한 아이디가 있는 것 같습니다. 뭐라고 찾아보야하 할지 검색어를 모르겠습니다. 

나중에 공부가 필요할 때 js를 깊게 파보아야 겠습니다.)

console.log(map.get({ a: 1 })); // undefined
console.log(map.get(obj)); // 2
 

map.has()로 값을 찾습니다. true false를 반환합니다.
map.has(str); // true
map.has('none'); // false  

 

 

map.delete()로 값을 삭제합니다.

map.delete(str); // 삭제를 한 뒤에는 true 를 반환합니다.
map.get('none'); // false

console.log(map); // Map(3) { 0 => 0, { a: 1 } => 2, [Function: fnc] => 3 }

 

 

map의 size 프로퍼티에 접근하여 길이를 확인합니다.
map.size // 4
map.length // undefined

 

hash는 for - of 문을 사용합니다.
for (let [key, value] of map) {
  console.log(key + ' : ' + value)
}

map.keys() 로 key에 접근합니다.
for (let key of map.keys()) {
  console.log(key)
}

map.values()로 value에 접근합니다.
for (let value of map.values()) {
  console.log(value)
}


function solution(participant, completion) {
    const myMap = new Map();

    for (const participant of participants) {
        if (!myMap.get(participant)) {
            // 같은 이름의 참가자가 있기 때문에 키의 존재를 확인합니다.
            myMap.set(participant, 1); // 없다면 해당 참가자의 이름 : 1 로 만듭니다.
        } else {
            // 존재하고 있다면 2명,3명,4명...이상으로 만들어 주기 위해 값을 1 더합니다.
            myMap.set(participant, myMap.get(participant) + 1);
        }
    }

    for (const completion of completions) {
        if (myMap.get(completion)) {
            // 완주자가 있다면
            myMap.set(completion, myMap.get(completion) - 1); // 완주자의 값을 1 빼줍니다.
        }
    }
    // 완주자는 참가자 -1명입니다.
    for (const participant of participants) {
        if (myMap.get(participant) && myMap.get(participant) >= 1) {
            // 참가자 중에서 값이 1인 참가자가 있다면
            answer = participant; // 해당 참가자를 반환합니다.
        }
    }
}
function solution(participant, completion) {
    let hashed = []
    participant.forEach(entry => {
        hashed[entry] = hashed[entry] ? hashed[entry] + 1 : 1        
    })
    completion.forEach(entry => {
        hashed[entry] = hashed[entry] - 1
    })

    for (var key in hashed) {
        if (hashed[key] >= 1) return key
    }
}

동일한 기능의 코드입니다. 

해쉬테이블을 배열로도 사용가능하다는 것을 알게 되었습니다. 

특정 값에 접근할 때 유용하게 쓸 수 있을 것 같습니다.

 

 

출처 : https://muhly.tistory.com/58