ํด์๋?
- ๊ฐ๋ : ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ๊ฐ์ ๋งคํํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ํด์ ํจ์๋ ๋น ๋ฅธ ์กฐํ๋ฅผ ์ํด ํค๋ฅผ ๋ณํ๋ ๊ฐ(์ฃผ๋ก ์ธ๋ฑ์ค)์ผ๋ก ๋ณํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์ฌ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๊ฒ ํด์ค๋ค.
- ์ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ํด์๋ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์
ํน์ง
- ๋จ๋ฐฉํฅ ์ก์ธ์ค: ํค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ฐพ์ ์๋ ์์ง๋ง ๊ฐ์์ ํค๋ฅผ ์ฐพ์ ์๋ ์๋ค.
- ์์ ์๊ฐ ์กฐํ(O(1)): ํด์ ํจ์๋ ํค์์ ์ง์ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ฏ๋ก ์ ์ฒด ๋ฐ์ดํฐ ์งํฉ์ ๊ฒ์ํ ํ์ ์์ด ๋น ๋ฅด๊ฒ ๊ฒ์ ๊ฐ๋ฅ
- ๋ณํ ํ์: ํด์ํจ์๋ฅผ ํตํด ํค๋ฅผ ์ธ๋ฑ์ค๋ก ๋ณํํด์ผ ๊ฐ์ ํจ์จ์ ์ผ๋ก ์ก์ธ์คํ ์ ์๋ค.
- ํด์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ํญ๋ชฉ์ ์ฐพ๊ธฐ ์ํด ๋ฐ์ดํฐ ์ ์ฒด ๊ฒ์์ ์ํํด์ผ ํ๋ฏ๋ก ํจ์จ์ฑ์ด ํจ์ฌ ๋จ์ด์ง๋ค.
ํด์ ํ ์ด๋ธ ๋๋ ๋ฒํท
- ํด์ฑ์์ 'ํด์ ํ ์ด๋ธ' ๋๋ 'ํด์ ๋งต'์ ํค-๊ฐ ์์ ์ ์ฅํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ฉฐ, '๋ฒํท'์ ์ด๋ฌํ ์์ ์ ์ฅํ๋ ํด์ ํ ์ด๋ธ ๋ด์ ๊ฐ๋ณ ์ฌ๋กฏ
ํด์ฑ์ ํ์ฉ ๋ถ์ผ
- ๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ: ํด์ฑ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ๊ฒ ๋๋๋ฆด ์ ์๋ ํด์ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ: ํด์ ํจ์๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ๊ฒ์ ์๋ ์ฆ๊ฐ
- ๋ธ๋ก์ฒด์ธ: ํด์ ํจ์๋ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ์์ ํธ๋์ญ์ ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ณด์์ ๋ณด์ฅํ๋ ๋ฐ ์ฌ์ฉ
ํด์ ํจ์
- ํ์ด์ฌ์์ ๋์ ๋๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ํด์ฑ์ ์ฌ์ฉํ์ฌ O(1) ์กฐํ๋ฅผ ํ์ฉ
ํด์ ํจ์๋ฅผ ์ค๊ณํ ๋ ๊ณ ๋ คํด์ผ ํ ์์
- ํด์ ํ ์ด๋ธ ํฌ๊ธฐ: ํด์ ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ์ ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ์ ๋ง์์ผ ํ๋ค.
- ์ถฉ๋ ์ต์ํ: ์ข์ ํด์ ํจ์๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํค๊ฐ ๋์ผํ ์ธ๋ฑ์ค์ ํด์ํ๋ ๊ฒฝ์ฐ(์ถฉ๋)๋ฅผ ์ต์ํํ๋ค. ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ฐ๋์ ์ฒ๋ฆฌํด์ผ ํ๋ค.(ex) ์ฒด์ธ ๋๋ ์คํ ์ฃผ์ ์ง์ )
์ผ๋ฐ์ ์ธ ํด์ ํจ์
1. ๋ถํ ๋ฐฉ๋ฒ(๋ชจ๋๋ฌ์ค)
- ๋ชจ๋๋ก ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ํด์๋ฅผ ๊ณ์ฐ. ( h(x) = x \ mod m )
- m์ ๋ณดํต ์์๋ก, ์ถฉ๋์ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋๋ฐ, ์์๋ 1๊ณผ ๊ทธ ์์ฒด ์ธ์๋ ๋๋์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ ๋ค๋ฅธ ์ซ์๊ฐ ๋์ผํ ํด์๋ฅผ ์์ฑํ ํ๋ฅ ์ ์ต์ํํ์ฌ m์ด ์์์ธ ๊ฒฝ์ฐ, ํด์ ํ ์ด๋ธ์ ํค ๋ถํฌ๊ฐ ๋ ๊ท ์ผํด์ง๋ค.
2. ๊ณฑ์ ๋ฐฉ๋ฒ
- ์ด ๋ฐฉ๋ฒ์ ํค์ ์์(ex) ํฉ๊ธ ๋น์จ)๋ฅผ ๊ณฑํ์ฌ ํ ์ด๋ธ ์ ์ฒด์ ๊ฐ์ ๋ถ์ฐ์ํจ๋ค.
- ( h(x) = \lfloor ((x \cdot A) \mod 1) \cdot m \rfloor \)
- A๋ ์์(ex) ํฉ๊ธ ๋น์จ)
- m์ ๋ฒํท์ ์
์ด ๋ฐฉ๋ฒ์ ์์๋ฅผ ์ฌ์ฉํ ์ง์ ์ ์ธ ๋ชจ๋์ ์ฐ์ฐ์ ํผํ๊ณ , ๋์ ํค์ ํฉ๊ธ๋น์ ๊ฐ์ ์์๋ฅผ ๊ณฑํ์ฌ ๊ท ์ผํ ๋ถํฌ
3. ๋ฌธ์์ด ํด์ฑ
- ๋ฌธ์์ด ํค๋ ํด์ ํ ์ด๋ธ์์๋ ํํ ๋ณผ ์ ์์ผ๋ฉฐ ํด์ ํจ์๋ ๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ก ๋ณํํด์ผ ํ๋ค.
- ๋ฌธ์์ด ํด์ฑ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ: ๋ฌธ์์ด์ ๋ฌธ์ ์ํ์ค๋ก ์ทจ๊ธํ๊ณ ๋ฌธ์ ๊ฐ์ ๊ฐ์ค์น ํฉ๊ณ๋ฅผ ๊ณ์ฐ
ํด์ ํ ์ด๋ธ ์ถฉ๋ ์ฒ๋ฆฌํ๊ธฐ
- ํด์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ ๋ ๊ฐ์ ํค๊ฐ ๋์ผํ ์ธ๋ฑ์ค(๋ฒํท)์ ๋งคํ๋์ด ์ถฉ๋ ๋ฐ์ ๊ฐ๋ฅ
1. ์ฒด์ธ ์ฐ๊ฒฐ(๋ถ๋ฆฌ ์ฐ๊ฒฐ)
- ์๋ ๋ฐฉ์
- ์ถฉ๋์ด ๋ฐ์ํ๋ฉด(๋ ๊ฐ์ ํค๊ฐ ๋์ผํ ๋ฒํท์ ๋งคํ๋๋ ๊ฒฝ์ฐ) ํด๋น ๋ฒํท์ ์ฐ๊ฒฐ๋ ๋ชฉ๋ก ์์ฑ
- ์ถฉ๋ํ๋ ์ ๊ฐ์ ๊ฐ์ ๋ฒํท์ ์ฐ๊ฒฐ๋ ๋ชฉ๋ก์ ์ถ๊ฐ๋๋ค.
- ์ฅ์
- ๊ตฌํ์ด ๊ฐ๋จ
- ํด์ ํ ์ด๋ธ์ ํค์ ๊ฐ์์ ์ ํ ์์ด ์ ์ฅ ๊ฐ๋ฅ
- ๋จ์
- ์ถฉ๋์ด ๋น๋ฒํ ๊ฒฝ์ฐ ๋งํฌ๋ ๋ชฉ๋ก์ ์ํํ๋ฉด ์๊ฐ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ฏ๋ก ๊ฒ์ ๋ฐ ์ฝ์ ์ ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค.
- ์ฐ๊ฒฐ๋ ๋ชฉ๋ก์์ ์ถ๊ฐ ํฌ์ธํฐ๋ฅผ ์ ์งํด์ผ ํ๋ ์ค๋ฒํค๋๋ก ์ธํด ๊ณต๊ฐ ํ์ฉ๋๊ฐ ๋จ์ด์ง๋ค.
2. ์คํ ์ด๋๋ ์ฑ
- ์คํ ์ด๋๋ ์ฑ์ ํ ์ด๋ธ์์ ์ ๊ฐ์ ๋ํ ๋ค๋ฅธ ๋น ๋ฒํท์ ์ฐพ์ ์ถฉ๋์ ํด๊ฒฐ
- ์คํ ์ด๋๋ ์ฑ์ ๋ฉ์๋
- a. ์ ํ ํ๋ก๋น
- ์๋ ๋ฐฉ์: ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋น ๋ฒํท์ด ๋ฐ๊ฒฌ๋ ๋๊น์ง ํ ์ด๋ธ์ ๋ค์ ๋ฒํท์ ํ์ธ
- ์ฅ์
- ๊ตฌํ์ด ๊ฐ๋จ
- ์ ์ฒด ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ฏ๋ก ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅ
- ๋จ์
- ๊ธฐ๋ณธ ํด๋ฌ์คํฐ๋ง: ํด์ ์ธ๋ฑ์ค๊ฐ ๊ฐ๊น์ด ๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๋ ๊ฒฝํฅ์ด ์์ด ํฅํ ๋ ๋ง์ ์ถฉ๋๋ฐ์ ๊ฐ๋ฅํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- ํ ์ด๋ธ์ด ๊ฐ๋ ์ฐจ๋ฉด ๋น ๋ฒํท์ ๊ฒ์ํ๋ ์๋ ๊ฐ์
- b. ์ด์ฐจ ํ๋ก๋น
- ์๋ ๋ฐฉ์: ์ ํ ํ๋ก๋น์์์ฒ๋ผ ๋ฐ๋ก ๋ค์ ๋ฒํท์ผ๋ก ์ด๋ํ๋ ๋์ ์ถฉ๋ ์ง์ ์์ ๋น ๋ฒํท์ด ๋ฐ๊ฒฌ๋ ๋๊น์ง ์ด์ฐจ ๋จ๊ณ๋ก ์ด๋
- ์ฅ์ :
- ์ ํ ํ๋ก๋น์ ๋นํด ํด๋ฌ์คํฐ๋ง์ด ์ค์ด๋ ๋ค
- ํ ์ด๋ธ ์ ์ฒด์ ๊ฐ์ ๋ ์ ๋ถ์ฐ์ํจ๋ค
- ๋จ์
- 2์ฐจ ํด๋ฌ์คํฐ๋ง: 1์ฐจ ํด๋ฌ์คํฐ๋ง์ ์ค์ด์ง๋ง, ๋์ผํ ์ธ๋ฑ์ค์ ํด์ํ๋ ํค๋ ๋์ผํ ์ด์ฐจ ํ๋ก๋น ํจํด์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ํค ๊ฐ์ ์ถฉ๋์ด ๋ฐ์ ๊ฐ๋ฅ
- c. ์ด์ค ํด์ฑ
- ์๋ ์๋ฆฌ: ๋ ๊ฐ์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๋ธ ์ํ์ค๋ฅผ ๊ฒฐ์ -> ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ ๋ฒ์งธ ํด์ ํจ์๊ฐ ๋น ๋ฒํท์ ์ฐพ๊ธฐ ์ํด ์ผ๋ง๋ ๋ฉ๋ฆฌ ์ด๋ํ ์ง ๊ฒฐ์
- ์ฅ์
- ๊ธฐ๋ณธ ๋ฐ ๋ณด์กฐ ํด๋ฌ์คํฐ๋ง์ ๋ชจ๋ ์ต์ํ
- ์ ํ ๋๋ ์ด์ฐจ ํ๋ก๋ธ๋ณด๋ค ํด์ ํ ์ด๋ธ ์ ์ฒด์ ๋ ๋์ ๋ถํฌ๋ฅผ ์ ๊ณต
- ๋จ์
- ๊ตฌํํ๊ธฐ๊ฐ ๋ ๋ณต์ก
์ถ๊ฐ
set
- ํด์ ํ ์ด๋ธ๋ก ๊ตฌํ๋์ด ์๋ค.
- ๊ทธ๋์ set์์ in ์ฐ์ฐ์ ํ ๋๋ ํด๋น ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ๋ฐ๋ก ์ฐพ์๊ฐ์ ๊ฒ์ํ๋๋ฐ, ์ด ๊ณผ์ ์ด O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ์ฆ, set์ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์ด์ฉํด ๊ฐ์ ์ ์ฅํ๊ณ ํ์ํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ด ์ด๋ ์์น์ ์๋์ง๋ฅผ ์ฆ์ ์ ์ ์๊ธฐ์ ๊ฒ์์๊ฐ์ด O(1)์ด๋ค.
๋ฌธ์
'''
arr = [1,2,3,4,8] target=6 return=True
arr = [2,3,4,9] target=10 return=False
'''
def solution(arr, target):
# ์ค๋ณต ์์ด ์ซ์ ์์ ์ฐพ์์ผ ํ๋ฏ๋ก, arr๋ฅผ ์งํฉ์ผ๋ก
seen = set()
for num in arr:
# ํ์ฌ ์ซ์๋ก๋ถํฐ ํ์ํ ๋ค๋ฅธ ์ซ์๋ฅผ ๊ณ์ฐ
complement = target - num
# complement๊ฐ seen์ ์๊ณ , num์ด complement์ ๋ค๋ฅผ ๋๋ง True๋ฅผ ๋ฐํ
if complement in seen:
return True
seen.add(num)
return False
print(solution([1,2,3,4,8],6))
print(solution([2,3,4,9],10))
print(solution([1,5,2,4],2))
def solution(string_list, query_list):
string_set = set(string_list) # string_list๋ฅผ set์ผ๋ก ๋ณํ, O(n)
result = []
for query in query_list: # query_list์ ๋ํด ์์ฐจ์ ์ผ๋ก ํ์ธ, O(m)
if query in string_set: # O(1) (ํด์ ํ
์ด๋ธ์ ์ด์ฉํ ํ์)
result.append(True)
else:
result.append(False)
return result
์์ฃผํ์ง ๋ชปํ ์ ์
https://school.programmers.co.kr/learn/courses/30/lessons/42576
def solution(participant, completion):
hashtable= {}
for i in participant:
if i not in hashtable:
hashtable[i]=1
else:
hashtable[i]+=1
for i in completion:
if i in hashtable:
hashtable[i]-=1
for k,v in hashtable.items():
if v == 1:
return k
print(solution(["leo", "kiki", "eden"],["eden", "kiki"] ))
ํ ์ธ ํ์ฌ
https://school.programmers.co.kr/learn/courses/30/lessons/131127
def solution(want, number, discount):
hashtable = {}
for i in range(len(want)):
hashtable[want[i]] = number[i]
cnt=0
for i in range(len(discount)-9):
hashtable2 = {}
for j in range(i,i+10):
if discount[j] not in hashtable2:
hashtable2[discount[j]] = 1
else:
hashtable2[discount[j]] += 1
if hashtable == hashtable2:
cnt+=1
return cnt
print(solution(["banana", "apple", "rice", "pork", "pot"],[3, 2, 2, 2, 1], ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"] ))
print(solution(["a", "b"], [1, 9], ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "a"]))
print(solution(["banana", "apple", "rice", "pork", "pot"],[3, 2, 2, 2, 1], ["apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana", "chicken", "apple"]))
์คํ์ฑํ ๋ฐฉ
https://school.programmers.co.kr/learn/courses/30/lessons/42888
์ด๋ฐ ์๋์ฝ๋
def solution(record):
answer = []
dict = {}
for i in record:
if i์ ์ฒซ ๋จ์ด๊ฐ 'Enter':
dict[i์ ๋๋ฒ์งธ ๋จ์ด] = i์ ์ธ๋ฒ์งธ ๋จ์ด
print(i์ ์ธ๋ฒ์งธ ๋จ์ด๋์ด ๋ค์ด์์ต๋๋ค)
elif i์ ์ฒซ ๋จ์ด๊ฐ 'Leave':
print(i์ dict[i์ ๋๋ฒ์งธ ๋จ์ด]์ value ์ด ๋๊ฐ์ต๋๋ค)
elif i์ ์ฒซ ๋จ์ด๊ฐ 'Change':
dict[i์ ๋๋ฒ์งธ ๋จ์ด] = i์ ์ธ๋ฒ์งธ ๋จ์ด๋ก ๋ณ๊ฒฝ
return answer
print(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]))
#๊ฒฐ๊ณผ: ["Prodo๋์ด ๋ค์ด์์ต๋๋ค.", "Ryan๋์ด ๋ค์ด์์ต๋๋ค.", "Prodo๋์ด ๋๊ฐ์ต๋๋ค.", "Prodo๋์ด ๋ค์ด์์ต๋๋ค."]
๋ณ๊ฒฝ ๋ต
def solution(record):
answer = []
dict = {}
for i in record:
parts = i.split()
action = parts[0]
uid = parts[1]
if action == "Enter" or action == "Change":
nickname = parts[2]
dict[uid] = nickname
for i in record:
parts = i.split()
action = parts[0]
uid = parts[1]
if action == "Enter":
answer.append(f"{dict[uid]}๋์ด ๋ค์ด์์ต๋๋ค.")
elif action == "Leave":
answer.append(f"{dict[uid]}๋์ด ๋๊ฐ์ต๋๋ค.")
return answer
๋ฒ ์คํธ์จ๋ฒ
https://school.programmers.co.kr/learn/courses/30/lessons/42579
from pydoc import plain
def solution(genres, plays):
answer = []
dict = {}
for i in range(len(genres)):
if genres[i] not in dict:
dict[genres[i]] = plays[i]
else:
dict[genres[i]] += plays[i]
dict2 = {}
for i in range(len(genres)):
if genres[i] not in dict2:
dict2[genres[i]] = [(i, plays[i])]
else:
dict2[genres[i]].append((i, plays[i]))
sorted_genres = sorted(dict.items(), key=lambda x: x[1], reverse=True)
for genres,k in sorted_genres:
sorted_songs = sorted(dict2[genres], key = lambda x: (-x[1], x[0]))
answer.extend([song[0] for song in sorted_songs[:2]])
return answer
์ ๊ณ ๊ฒฐ๊ณผ ๋ฐ๊ธฐ
https://school.programmers.co.kr/learn/courses/30/lessons/92334
def solution(id_list, report, k):
answer = []
reporter_dict = {user: set() for user in id_list}
reported_dict = {user: 0 for user in id_list}
for i in report:
parts = i.split()
reporter = parts[0]
reported = parts[1]
if reported not in reporter_dict[reporter]:
reporter_dict[reporter].add(reported)
reported_dict[reported] += 1
blocked_users = {user for user, count in reported_dict.items() if count >= k}
for reporter in id_list:
count = sum(1 for user in reporter_dict[reporter] if user in blocked_users)
answer.append(count)
return answer
'๐ฏ ์๊ณ ๋ฆฌ์ฆ > ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์งํฉ (1) | 2024.10.04 |
---|---|
ํธ๋ฆฌ (0) | 2024.10.04 |
ํ (1) | 2024.10.03 |
์คํ (0) | 2024.09.10 |
๋ฐฐ์ด (1) | 2024.09.09 |
ํด์๋?
- ๊ฐ๋ : ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ๊ฐ์ ๋งคํํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ํด์ ํจ์๋ ๋น ๋ฅธ ์กฐํ๋ฅผ ์ํด ํค๋ฅผ ๋ณํ๋ ๊ฐ(์ฃผ๋ก ์ธ๋ฑ์ค)์ผ๋ก ๋ณํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์ฌ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๊ฒ ํด์ค๋ค.
- ์ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ํด์๋ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์
ํน์ง
- ๋จ๋ฐฉํฅ ์ก์ธ์ค: ํค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ฐพ์ ์๋ ์์ง๋ง ๊ฐ์์ ํค๋ฅผ ์ฐพ์ ์๋ ์๋ค.
- ์์ ์๊ฐ ์กฐํ(O(1)): ํด์ ํจ์๋ ํค์์ ์ง์ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํ๋ฏ๋ก ์ ์ฒด ๋ฐ์ดํฐ ์งํฉ์ ๊ฒ์ํ ํ์ ์์ด ๋น ๋ฅด๊ฒ ๊ฒ์ ๊ฐ๋ฅ
- ๋ณํ ํ์: ํด์ํจ์๋ฅผ ํตํด ํค๋ฅผ ์ธ๋ฑ์ค๋ก ๋ณํํด์ผ ๊ฐ์ ํจ์จ์ ์ผ๋ก ์ก์ธ์คํ ์ ์๋ค.
- ํด์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ํญ๋ชฉ์ ์ฐพ๊ธฐ ์ํด ๋ฐ์ดํฐ ์ ์ฒด ๊ฒ์์ ์ํํด์ผ ํ๋ฏ๋ก ํจ์จ์ฑ์ด ํจ์ฌ ๋จ์ด์ง๋ค.
ํด์ ํ ์ด๋ธ ๋๋ ๋ฒํท
- ํด์ฑ์์ 'ํด์ ํ ์ด๋ธ' ๋๋ 'ํด์ ๋งต'์ ํค-๊ฐ ์์ ์ ์ฅํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ฉฐ, '๋ฒํท'์ ์ด๋ฌํ ์์ ์ ์ฅํ๋ ํด์ ํ ์ด๋ธ ๋ด์ ๊ฐ๋ณ ์ฌ๋กฏ
ํด์ฑ์ ํ์ฉ ๋ถ์ผ
- ๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ: ํด์ฑ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ๊ฒ ๋๋๋ฆด ์ ์๋ ํด์ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ: ํด์ ํจ์๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ๊ฒ์ ์๋ ์ฆ๊ฐ
- ๋ธ๋ก์ฒด์ธ: ํด์ ํจ์๋ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ์์ ํธ๋์ญ์ ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ณด์์ ๋ณด์ฅํ๋ ๋ฐ ์ฌ์ฉ
ํด์ ํจ์
- ํ์ด์ฌ์์ ๋์ ๋๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ํด์ฑ์ ์ฌ์ฉํ์ฌ O(1) ์กฐํ๋ฅผ ํ์ฉ
ํด์ ํจ์๋ฅผ ์ค๊ณํ ๋ ๊ณ ๋ คํด์ผ ํ ์์
- ํด์ ํ ์ด๋ธ ํฌ๊ธฐ: ํด์ ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ์ ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ์ ๋ง์์ผ ํ๋ค.
- ์ถฉ๋ ์ต์ํ: ์ข์ ํด์ ํจ์๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํค๊ฐ ๋์ผํ ์ธ๋ฑ์ค์ ํด์ํ๋ ๊ฒฝ์ฐ(์ถฉ๋)๋ฅผ ์ต์ํํ๋ค. ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ฐ๋์ ์ฒ๋ฆฌํด์ผ ํ๋ค.(ex) ์ฒด์ธ ๋๋ ์คํ ์ฃผ์ ์ง์ )
์ผ๋ฐ์ ์ธ ํด์ ํจ์
1. ๋ถํ ๋ฐฉ๋ฒ(๋ชจ๋๋ฌ์ค)
- ๋ชจ๋๋ก ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ํด์๋ฅผ ๊ณ์ฐ. ( h(x) = x \ mod m )
- m์ ๋ณดํต ์์๋ก, ์ถฉ๋์ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋๋ฐ, ์์๋ 1๊ณผ ๊ทธ ์์ฒด ์ธ์๋ ๋๋์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ ๋ค๋ฅธ ์ซ์๊ฐ ๋์ผํ ํด์๋ฅผ ์์ฑํ ํ๋ฅ ์ ์ต์ํํ์ฌ m์ด ์์์ธ ๊ฒฝ์ฐ, ํด์ ํ ์ด๋ธ์ ํค ๋ถํฌ๊ฐ ๋ ๊ท ์ผํด์ง๋ค.
2. ๊ณฑ์ ๋ฐฉ๋ฒ
- ์ด ๋ฐฉ๋ฒ์ ํค์ ์์(ex) ํฉ๊ธ ๋น์จ)๋ฅผ ๊ณฑํ์ฌ ํ ์ด๋ธ ์ ์ฒด์ ๊ฐ์ ๋ถ์ฐ์ํจ๋ค.
- ( h(x) = \lfloor ((x \cdot A) \mod 1) \cdot m \rfloor \)
- A๋ ์์(ex) ํฉ๊ธ ๋น์จ)
- m์ ๋ฒํท์ ์
์ด ๋ฐฉ๋ฒ์ ์์๋ฅผ ์ฌ์ฉํ ์ง์ ์ ์ธ ๋ชจ๋์ ์ฐ์ฐ์ ํผํ๊ณ , ๋์ ํค์ ํฉ๊ธ๋น์ ๊ฐ์ ์์๋ฅผ ๊ณฑํ์ฌ ๊ท ์ผํ ๋ถํฌ
3. ๋ฌธ์์ด ํด์ฑ
- ๋ฌธ์์ด ํค๋ ํด์ ํ ์ด๋ธ์์๋ ํํ ๋ณผ ์ ์์ผ๋ฉฐ ํด์ ํจ์๋ ๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ก ๋ณํํด์ผ ํ๋ค.
- ๋ฌธ์์ด ํด์ฑ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ: ๋ฌธ์์ด์ ๋ฌธ์ ์ํ์ค๋ก ์ทจ๊ธํ๊ณ ๋ฌธ์ ๊ฐ์ ๊ฐ์ค์น ํฉ๊ณ๋ฅผ ๊ณ์ฐ
ํด์ ํ ์ด๋ธ ์ถฉ๋ ์ฒ๋ฆฌํ๊ธฐ
- ํด์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ ๋ ๊ฐ์ ํค๊ฐ ๋์ผํ ์ธ๋ฑ์ค(๋ฒํท)์ ๋งคํ๋์ด ์ถฉ๋ ๋ฐ์ ๊ฐ๋ฅ
1. ์ฒด์ธ ์ฐ๊ฒฐ(๋ถ๋ฆฌ ์ฐ๊ฒฐ)
- ์๋ ๋ฐฉ์
- ์ถฉ๋์ด ๋ฐ์ํ๋ฉด(๋ ๊ฐ์ ํค๊ฐ ๋์ผํ ๋ฒํท์ ๋งคํ๋๋ ๊ฒฝ์ฐ) ํด๋น ๋ฒํท์ ์ฐ๊ฒฐ๋ ๋ชฉ๋ก ์์ฑ
- ์ถฉ๋ํ๋ ์ ๊ฐ์ ๊ฐ์ ๋ฒํท์ ์ฐ๊ฒฐ๋ ๋ชฉ๋ก์ ์ถ๊ฐ๋๋ค.
- ์ฅ์
- ๊ตฌํ์ด ๊ฐ๋จ
- ํด์ ํ ์ด๋ธ์ ํค์ ๊ฐ์์ ์ ํ ์์ด ์ ์ฅ ๊ฐ๋ฅ
- ๋จ์
- ์ถฉ๋์ด ๋น๋ฒํ ๊ฒฝ์ฐ ๋งํฌ๋ ๋ชฉ๋ก์ ์ํํ๋ฉด ์๊ฐ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ฏ๋ก ๊ฒ์ ๋ฐ ์ฝ์ ์ ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค.
- ์ฐ๊ฒฐ๋ ๋ชฉ๋ก์์ ์ถ๊ฐ ํฌ์ธํฐ๋ฅผ ์ ์งํด์ผ ํ๋ ์ค๋ฒํค๋๋ก ์ธํด ๊ณต๊ฐ ํ์ฉ๋๊ฐ ๋จ์ด์ง๋ค.
2. ์คํ ์ด๋๋ ์ฑ
- ์คํ ์ด๋๋ ์ฑ์ ํ ์ด๋ธ์์ ์ ๊ฐ์ ๋ํ ๋ค๋ฅธ ๋น ๋ฒํท์ ์ฐพ์ ์ถฉ๋์ ํด๊ฒฐ
- ์คํ ์ด๋๋ ์ฑ์ ๋ฉ์๋
- a. ์ ํ ํ๋ก๋น
- ์๋ ๋ฐฉ์: ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์๊ณ ๋ฆฌ์ฆ์ ๋น ๋ฒํท์ด ๋ฐ๊ฒฌ๋ ๋๊น์ง ํ ์ด๋ธ์ ๋ค์ ๋ฒํท์ ํ์ธ
- ์ฅ์
- ๊ตฌํ์ด ๊ฐ๋จ
- ์ ์ฒด ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ฏ๋ก ๊ณต๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅ
- ๋จ์
- ๊ธฐ๋ณธ ํด๋ฌ์คํฐ๋ง: ํด์ ์ธ๋ฑ์ค๊ฐ ๊ฐ๊น์ด ๊ฐ์ ํด๋ฌ์คํฐ๋ฅผ ํ์ฑํ๋ ๊ฒฝํฅ์ด ์์ด ํฅํ ๋ ๋ง์ ์ถฉ๋๋ฐ์ ๊ฐ๋ฅํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- ํ ์ด๋ธ์ด ๊ฐ๋ ์ฐจ๋ฉด ๋น ๋ฒํท์ ๊ฒ์ํ๋ ์๋ ๊ฐ์
- b. ์ด์ฐจ ํ๋ก๋น
- ์๋ ๋ฐฉ์: ์ ํ ํ๋ก๋น์์์ฒ๋ผ ๋ฐ๋ก ๋ค์ ๋ฒํท์ผ๋ก ์ด๋ํ๋ ๋์ ์ถฉ๋ ์ง์ ์์ ๋น ๋ฒํท์ด ๋ฐ๊ฒฌ๋ ๋๊น์ง ์ด์ฐจ ๋จ๊ณ๋ก ์ด๋
- ์ฅ์ :
- ์ ํ ํ๋ก๋น์ ๋นํด ํด๋ฌ์คํฐ๋ง์ด ์ค์ด๋ ๋ค
- ํ ์ด๋ธ ์ ์ฒด์ ๊ฐ์ ๋ ์ ๋ถ์ฐ์ํจ๋ค
- ๋จ์
- 2์ฐจ ํด๋ฌ์คํฐ๋ง: 1์ฐจ ํด๋ฌ์คํฐ๋ง์ ์ค์ด์ง๋ง, ๋์ผํ ์ธ๋ฑ์ค์ ํด์ํ๋ ํค๋ ๋์ผํ ์ด์ฐจ ํ๋ก๋น ํจํด์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ํค ๊ฐ์ ์ถฉ๋์ด ๋ฐ์ ๊ฐ๋ฅ
- c. ์ด์ค ํด์ฑ
- ์๋ ์๋ฆฌ: ๋ ๊ฐ์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๋ธ ์ํ์ค๋ฅผ ๊ฒฐ์ -> ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ ๋ฒ์งธ ํด์ ํจ์๊ฐ ๋น ๋ฒํท์ ์ฐพ๊ธฐ ์ํด ์ผ๋ง๋ ๋ฉ๋ฆฌ ์ด๋ํ ์ง ๊ฒฐ์
- ์ฅ์
- ๊ธฐ๋ณธ ๋ฐ ๋ณด์กฐ ํด๋ฌ์คํฐ๋ง์ ๋ชจ๋ ์ต์ํ
- ์ ํ ๋๋ ์ด์ฐจ ํ๋ก๋ธ๋ณด๋ค ํด์ ํ ์ด๋ธ ์ ์ฒด์ ๋ ๋์ ๋ถํฌ๋ฅผ ์ ๊ณต
- ๋จ์
- ๊ตฌํํ๊ธฐ๊ฐ ๋ ๋ณต์ก
์ถ๊ฐ
set
- ํด์ ํ ์ด๋ธ๋ก ๊ตฌํ๋์ด ์๋ค.
- ๊ทธ๋์ set์์ in ์ฐ์ฐ์ ํ ๋๋ ํด๋น ๊ฐ์ด ์ ์ฅ๋ ์์น๋ฅผ ๋ฐ๋ก ์ฐพ์๊ฐ์ ๊ฒ์ํ๋๋ฐ, ์ด ๊ณผ์ ์ด O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ์ฆ, set์ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์ด์ฉํด ๊ฐ์ ์ ์ฅํ๊ณ ํ์ํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ด ์ด๋ ์์น์ ์๋์ง๋ฅผ ์ฆ์ ์ ์ ์๊ธฐ์ ๊ฒ์์๊ฐ์ด O(1)์ด๋ค.
๋ฌธ์
'''
arr = [1,2,3,4,8] target=6 return=True
arr = [2,3,4,9] target=10 return=False
'''
def solution(arr, target):
# ์ค๋ณต ์์ด ์ซ์ ์์ ์ฐพ์์ผ ํ๋ฏ๋ก, arr๋ฅผ ์งํฉ์ผ๋ก
seen = set()
for num in arr:
# ํ์ฌ ์ซ์๋ก๋ถํฐ ํ์ํ ๋ค๋ฅธ ์ซ์๋ฅผ ๊ณ์ฐ
complement = target - num
# complement๊ฐ seen์ ์๊ณ , num์ด complement์ ๋ค๋ฅผ ๋๋ง True๋ฅผ ๋ฐํ
if complement in seen:
return True
seen.add(num)
return False
print(solution([1,2,3,4,8],6))
print(solution([2,3,4,9],10))
print(solution([1,5,2,4],2))
def solution(string_list, query_list):
string_set = set(string_list) # string_list๋ฅผ set์ผ๋ก ๋ณํ, O(n)
result = []
for query in query_list: # query_list์ ๋ํด ์์ฐจ์ ์ผ๋ก ํ์ธ, O(m)
if query in string_set: # O(1) (ํด์ ํ
์ด๋ธ์ ์ด์ฉํ ํ์)
result.append(True)
else:
result.append(False)
return result
์์ฃผํ์ง ๋ชปํ ์ ์
https://school.programmers.co.kr/learn/courses/30/lessons/42576
def solution(participant, completion):
hashtable= {}
for i in participant:
if i not in hashtable:
hashtable[i]=1
else:
hashtable[i]+=1
for i in completion:
if i in hashtable:
hashtable[i]-=1
for k,v in hashtable.items():
if v == 1:
return k
print(solution(["leo", "kiki", "eden"],["eden", "kiki"] ))
ํ ์ธ ํ์ฌ
https://school.programmers.co.kr/learn/courses/30/lessons/131127
def solution(want, number, discount):
hashtable = {}
for i in range(len(want)):
hashtable[want[i]] = number[i]
cnt=0
for i in range(len(discount)-9):
hashtable2 = {}
for j in range(i,i+10):
if discount[j] not in hashtable2:
hashtable2[discount[j]] = 1
else:
hashtable2[discount[j]] += 1
if hashtable == hashtable2:
cnt+=1
return cnt
print(solution(["banana", "apple", "rice", "pork", "pot"],[3, 2, 2, 2, 1], ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"] ))
print(solution(["a", "b"], [1, 9], ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "a"]))
print(solution(["banana", "apple", "rice", "pork", "pot"],[3, 2, 2, 2, 1], ["apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana", "chicken", "apple"]))
์คํ์ฑํ ๋ฐฉ
https://school.programmers.co.kr/learn/courses/30/lessons/42888
์ด๋ฐ ์๋์ฝ๋
def solution(record):
answer = []
dict = {}
for i in record:
if i์ ์ฒซ ๋จ์ด๊ฐ 'Enter':
dict[i์ ๋๋ฒ์งธ ๋จ์ด] = i์ ์ธ๋ฒ์งธ ๋จ์ด
print(i์ ์ธ๋ฒ์งธ ๋จ์ด๋์ด ๋ค์ด์์ต๋๋ค)
elif i์ ์ฒซ ๋จ์ด๊ฐ 'Leave':
print(i์ dict[i์ ๋๋ฒ์งธ ๋จ์ด]์ value ์ด ๋๊ฐ์ต๋๋ค)
elif i์ ์ฒซ ๋จ์ด๊ฐ 'Change':
dict[i์ ๋๋ฒ์งธ ๋จ์ด] = i์ ์ธ๋ฒ์งธ ๋จ์ด๋ก ๋ณ๊ฒฝ
return answer
print(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]))
#๊ฒฐ๊ณผ: ["Prodo๋์ด ๋ค์ด์์ต๋๋ค.", "Ryan๋์ด ๋ค์ด์์ต๋๋ค.", "Prodo๋์ด ๋๊ฐ์ต๋๋ค.", "Prodo๋์ด ๋ค์ด์์ต๋๋ค."]
๋ณ๊ฒฝ ๋ต
def solution(record):
answer = []
dict = {}
for i in record:
parts = i.split()
action = parts[0]
uid = parts[1]
if action == "Enter" or action == "Change":
nickname = parts[2]
dict[uid] = nickname
for i in record:
parts = i.split()
action = parts[0]
uid = parts[1]
if action == "Enter":
answer.append(f"{dict[uid]}๋์ด ๋ค์ด์์ต๋๋ค.")
elif action == "Leave":
answer.append(f"{dict[uid]}๋์ด ๋๊ฐ์ต๋๋ค.")
return answer
๋ฒ ์คํธ์จ๋ฒ
https://school.programmers.co.kr/learn/courses/30/lessons/42579
from pydoc import plain
def solution(genres, plays):
answer = []
dict = {}
for i in range(len(genres)):
if genres[i] not in dict:
dict[genres[i]] = plays[i]
else:
dict[genres[i]] += plays[i]
dict2 = {}
for i in range(len(genres)):
if genres[i] not in dict2:
dict2[genres[i]] = [(i, plays[i])]
else:
dict2[genres[i]].append((i, plays[i]))
sorted_genres = sorted(dict.items(), key=lambda x: x[1], reverse=True)
for genres,k in sorted_genres:
sorted_songs = sorted(dict2[genres], key = lambda x: (-x[1], x[0]))
answer.extend([song[0] for song in sorted_songs[:2]])
return answer
์ ๊ณ ๊ฒฐ๊ณผ ๋ฐ๊ธฐ
https://school.programmers.co.kr/learn/courses/30/lessons/92334
def solution(id_list, report, k):
answer = []
reporter_dict = {user: set() for user in id_list}
reported_dict = {user: 0 for user in id_list}
for i in report:
parts = i.split()
reporter = parts[0]
reported = parts[1]
if reported not in reporter_dict[reporter]:
reporter_dict[reporter].add(reported)
reported_dict[reported] += 1
blocked_users = {user for user, count in reported_dict.items() if count >= k}
for reporter in id_list:
count = sum(1 for user in reporter_dict[reporter] if user in blocked_users)
answer.append(count)
return answer
'๐ฏ ์๊ณ ๋ฆฌ์ฆ > ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์งํฉ (1) | 2024.10.04 |
---|---|
ํธ๋ฆฌ (0) | 2024.10.04 |
ํ (1) | 2024.10.03 |
์คํ (0) | 2024.09.10 |
๋ฐฐ์ด (1) | 2024.09.09 |