706. Design HashMap

kukudas·2022년 3월 28일
0

Algorithm

목록 보기
25/46

separate chaining 방법
들어갈 자리에 있으면 연결리스트로 그 다음에 채워줌.

class ListNode:
    def __init__(self, key=None, value=None):
        self.key = key
        self.value = value
        self.next = None


class MyHashMap:

    def __init__(self):
        # 대충 크기 1000으로 잡고
        self.size = 1000
        # index를 key로 하고 ListNnode를 value로 하는 해시테이블
        self.table = collections.defaultdict(ListNode)

    # 해쉬 함수는 그냥 %로 할거임
    def hash(self, key):
        return key % self.size

    def put(self, key, value):
        index = hash(key)

        # 없으면 생성해주고
        if self.table[index].value is None:
            self.table[index].key = key
            self.table[index].value = value

            return

        # 있으면 업데이트 혹은 추가해줌(key는 다른데 인덱스는 같을 수 있음)
        node = self.table[index]
        while node:
            # key가 같으면 업데이트 해줌
            if node.key == key:
                node.value = value
                return

            if node.next:
                break

            node = node.next
        
        # 다음거에 추가해줌
        node.next = ListNode(key, value)

    def get(self, key):
        index = hash(key)

        # 없으면 -1 리턴해줌
        if self.table[index].value is None:
            return -1

        node = self.table[index]
        while node:
            if node.key == key:
                return node.value

            node = node.next

        return -1

    def remove(self, key):
        index = hash(key)

        # 해당 index에 없으면 return
        if self.table[index].value is None:
            return

        node = self.table[index]
        # 삭제하고자 하는게 연결리스트의 맨 앞 이면
        if node.key == key:
            # 다음에 이어진게 없으면 그냥 노드 초기화해줌
            if node.next is None:
                # 이거 ListNode()말고 None으로 하면 defaultdict라서 None이 한 번 들어가면
                # 다음에 self.table[index].value is None:를 할 때 없는 키 조회시 ListNode로 생성이 안되고
                # self.table[index]에 None이 박혀버려서 문제 생기니 주의해야함
                self.table[index] = ListNode()
            # 다음에 이어진게 있으면 맨 앞에꺼 버려버리고 다음으로 이어버림
            else:
                self.table[index] = node.next
            return

            # 사실 이거 한줄로 처리하는게 보기는 좋음
            # self.table[index] = ListNonde() if node.next is None else node.next

        # 맨 앞이 아니면
        prev = node
        while node:
            # 삭제할 것 찾았으면
            if node.key == key:
                prev.next = node.next
                return

            # 노드랑 prev 한 칸 씩 이동시킴
            prev, node = node, node.next

그냥 문제가 요구하는 대로 간단하게 푸는 방식

class MyHashMap:

    def __init__(self):
        self.table = [None] * 10000001

    def put(self, key, value):
        self.table[key] = value

    def get(self, key):
        if self.table[key] == None:
            return -1

        return self.table[key]

    def remove(self, key):
        self.table[key] = None

https://leetcode.com/problems/design-hashmap/

0개의 댓글

관련 채용 정보