⭐ intro : 문제를 생각해나간 방식
라이브러리를 생성하지 않고 class를 이용해서 HashMap이라는 기능을 구현하는 문제이다. 영어로 되어있는 리트코드라 천천히 해석하면서 확인해나갔다.
- MyHashMap()은 빈 map을 생성한다 (myHashMap 생성자함수 생성)
- put(key, value)를 실행하면 맵에 해당 값이 생성됌. 이미 존재하는 key값이라면 value를 덮어씌우고 업데이트한다.
- get(key)를 실행하면 key에 매핑되어있는 value를 호출하고 존재하지 않는 key를 호출하면 -1을 호출
- remove(key)를 실행하면 해당 key와 그 속해있는 value값을 삭제한다.
기존에 stack, queue를 구현했던것과 비슷하게 class문법을 활용해서 작성하면 되겠다 싶었다. HashMap이 뭔지 잘 몰랐는데 기능을 구현할수록 걍 Map()메서드처럼 구현된다는 것을 깨닫게 되었다.
(+ 자세히 찾아보니 JAVA에서는 서로 다른 개념이고, JavaScript에서는 map === hashMap 인것을 깨달았다. JAVA에서 map은 그냥 인터페이스 그 자체이고 new HashMap()로 인스턴스를 생성해줘야지 JavaScript 기준으로 map처럼 사용할 수 있다는 것을 알았다. 사실 map구조체를 객체라 불러야할지 어떻게 불러야 할지 고민이었는데 앞으로 JS개발 입장에서는 hashmap이라고 불러도 무관할듯하다)
⭐ 풀이과정
기본적인 map() 에 내장된 set(put), get, delete(remove) 기능을 구현하면 되겠다 싶었다. 먼저 공통적으로 쓰일 메서드로 constructor에 map이라는 이름의 배열과 인덱스를 관리하는 index 메서드를 만들어둔다.
class MyHashMap {
constructor() {
this.map = [];
this.index = 0;
}
}
다음으로 map에 key, value값을 호출하는 put 메서드를 구현해본다. 모든 메서드는 전체적으로 constructor에 구현해둔 map[]을 기준으로 배열메서드로 집어넣고 빼고 작업한다. 일단 중복 key값을 넣을 경우 새롭게 value를 업데이트 할 수 있는 코드를 만들어두고, 중복값이 없으면 배열 끝에 값을 집어넣을 수 있도록 만든다.
class MyHashMap {
constructor() {
this.map = [];
this.index = 0;
}
put(key, value) {
for (let pair of this.map) {
if (pair[0] === key) {
pair[1] = value
return
}
}
this.map.push([key,value])
}
}
해당 key값에 대응하는 value값을 확인하는 get 메서드를 만들어본다. 마찬가지로 map[] 기준을 순회하면서 매개변수로 들어온 key값에 해당되는 value값을 호출하도록 만들고, 값이 존재하지 않으면 -1을 리턴하도록 만든다
class MyHashMap {
constructor() {
this.map = [];
this.index = 0;
}
put(key, value){...}
get(key) {
for (let pair of this.map) {
if (pair[0] === key) return pair[1];
}
return -1;
}
}
마지막으로 해당 key에 해당되는 값을 제거하는 remove메서드를 만든다. map[] 기준으로 순회하되, key값과 해당되는 key, value쌍을 제거하도록 하고 해당 key값을 리턴하도록 만든다. 사실 여기에서 왜 삭제된 map[]값을 리턴하는 것이 아닌 key값을 리턴하는지는 잘 모르겠지만 메서드를 그렇게 만들라하니 따를수밖에... 그리고 splice(number, 1)메서드를 이용해서 number 위치의 배열값을 잘라내도록 만들면 모든 메서드 구현이 완료된다.
class MyHashMap {
constructor() {
this.map = [];
this.index = 0;
}
put(key, value) {...}
get(key) {...}
remove(key) {
for (let i in this.map) {
if (this.map[i][0] === key) {
let value = this.map[i][1];
this.map.splice(i, 1);
return value;
}
}
}
}
⭐ 제출답안
class MyHashMap {
constructor() {
this.map = [];
this.index = 0;
}
put(key, value) {
for (let pair of this.map) {
if (pair[0] === key) {
pair[1] = value
return
}
}
this.map.push([key,value])
}
get(key) {
for (let pair of this.map) {
if (pair[0] === key) return pair[1];
}
return -1;
}
remove(key) {
for (let i in this.map) {
if (this.map[i][0] === key) {
let value = this.map[i][1];
this.map.splice(i, 1);
return value;
}
}
}
}
⭐ 공부했던 개념들
Map - JavaScript | MDN
Map 객체는 키-값 쌍과 키의 원래 삽입 순서를 기억합니다. 모든 값(객체 및 원시 값 모두)은 키 또는 값으로 사용될 수 있습니다.
developer.mozilla.org