HashTable

hash 함수

임의크기 데이터를 고정크기 값으로 매핑하는데 사용

해싱은 가능한 빠르게 저장하고 검색하기위해 사용하는 기법 중 하나.
파이썬의 set 이나 딕셔너리가 이를 활용한 자료구조.
그래서 시간복잡도가 O(1)임!! <- 이게 진짜 중요해.

 

보석과 돌

https://leetcode.com/problems/jewels-and-stones/

 

Jewels and Stones - LeetCode

Can you solve this real interview question? Jewels and Stones - You're given strings jewels representing the types of stones that are jewels, and stones representing the stones you have. Each character in stones is a type of stone you have. You want to kno

leetcode.com

딕셔너리를 이용해서 풀 수 있는 간단한 구현 문제.

class Solution:
    def numJewelsInStones(self, jewels: str, stones: str) -> int:
        freqs = {}
        count = 0
        
        for char in stones:
            if char not in freqs:
                freqs[char] = 1
            
            else:
                freqs[char] += 1
                
        for char in jewels:
            if char in freqs:
                count += freqs[char]
                
        return count

중복문자 없는 가장 긴 substring

https://leetcode.com/problems/longest-substring-without-repeating-characters/

 

Longest Substring Without Repeating Characters - LeetCode

Can you solve this real interview question? Longest Substring Without Repeating Characters - Given a string s, find the length of the longest substring without repeating characters.   Example 1: Input: s = "abcabcbb" Output: 3 Explanation: The answer is "

leetcode.com

아무래도 제일 난이도가 있던 문제.

포인터 두개를 가지고 시작해서 index, start의 위치를 가지고 슬라이딩 윈도우 기법으로 미끄러져나가며 확인한다.

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        used = {} # 순차적으로 지나가면서 넣은 딕셔너리
        max_length = start = 0
        for index, char in enumerate(s):
            if char in used and start <= used[char]: # 만약에 다음으로 올값이 이미 used딕셔너리에 있고, 해당 값이 시작하는 위치보다 높다면
                start = used[char] + 1 # 시작 하는 위치를 해당 value값보다 높여준다. 그러면 그전에 사용한 변수들 값과는 상관이 없어진다
            else:
                max_length = max(max_length, index - start +1) # 기존의 길이보다 높으면 두번째 매개변수가 그렇지 않으면 기존의 max_length가 유지
            used[char] = index # 값과 index값을 저장
        return max_length

상위 K 빈도 요소

https://leetcode.com/problems/top-k-frequent-elements/

 

Top K Frequent Elements - LeetCode

Can you solve this real interview question? Top K Frequent Elements - Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.   Example 1: Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2]

leetcode.com

딕셔너리를 소팅하는 법을 안다면 쉽게 풀리는 문제.

class Solution:
    def topKFrequent(self, nums: List[int], k: int):
        d = dict(Counter(nums))
        d = dict(sorted(d.items(), key = lambda item: item[1], reverse = True))
        return list(d)[:k]

파이썬 콜렉션 중에 Counter의 most_common을 이용해도 쉽게 풀 수 있다.

most_common(k)는 카운터가 센 key value에서 ( 어떤숫자가 , 몇 개 있는지) value 가 가장 높은 k개의 원소를 리스트로 리턴하는 함수. 

리턴 값은 딕셔너리의 key value의 tuple 형태가 원소인 리스트.

from typing import List, Counter


class Solution:
    def topKFrequent(self, nums: List[int], k: int):
        d = Counter(nums).most_common(k)
        ans = []
        for i in d:
            ans.append(i[0])
        return ans

수 찾기 

https://www.acmicpc.net/problem/1920

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

이게 뭐라고 정답률이 20퍼지? 하고 단순하게 접근했다가 나도 20퍼단에 들어간 문제.

처 - 참

시간초과의 문제는 알고리즘의 시간 복잡도를 잘 생각하도록 하자.

리스트는 일반적으로 찾을 때 O(n) 의 시간 복잡도를 가지는 데 반해, 해시맵은 ( 파이썬의 경우 set이나 dict ) O(1)의 시간복잡도를 가져서, 복잡도를 한 차원 낮추어 주는 효과가 있다.

N = int(input())
# s = list(map(int, input().split())) -> 이걸로 하면 O(n) 의 시간복잡도로 순회를 돌아서 
s = set(map(int, input().split()))
M = int(input())
lst2 = list(map(int, input().split()))
for i in lst2: # 여기서 O(n^2) 의 시간복잡도가 되어서 시간초과가 난다.
    if i in s:
        # set은 hashtable으로 만들었다고 일단 생각한다면, 해시테이블에선 시간복잡도가 O(1)이 탐색시간이라서
        print(1)
    else:
        print(0)

비밀번호 찾기

https://www.acmicpc.net/problem/17219

 

17219번: 비밀번호 찾기

첫째 줄에 저장된 사이트 주소의 수 N(1 ≤ N ≤ 100,000)과 비밀번호를 찾으려는 사이트 주소의 수 M(1 ≤ M ≤ 100,000)이 주어진다. 두번째 줄부터 N개의 줄에 걸쳐 각 줄에 사이트 주소와 비밀번

www.acmicpc.net

마찬가지로 문제 자체가 어렵다기보다는, 시간복잡도를 잘 생각해야 하는 문제.

입력데이터의 값이 아주 많아질 때 해시테이블이 꼭 필요하다고 강조해주는 문제다.

N, M = map(int, input().split())
d = {}

for _ in range(N):
    site, pw = input().split()
    d[site] = pw

for _ in range(M):
    site = input()
    print(d[site])

 

'항해99 > [항해99] 알고리즘' 카테고리의 다른 글

[항해99] BFS 너비 우선 탐색  (0) 2023.12.18
[항해99] DFS  (0) 2023.12.16
[항해99] Queue  (0) 2023.12.14
[항해99] Stack  (0) 2023.12.14
[항해99] LinkedList  (0) 2023.12.13