Today I Learn 2022.04.04
๋ฆฌ์คํธ๋ง ๋ค๋ฃจ๋ค๊ฐ ๋์ ๋๋ฆฌ๋ฅผ ์ค๋๋ง์ ๋ค๋ฃจ๋ ๊ธฐ์ด ๋ฌธ๋ฒ๋ ๊ธฐ์ต์ด ์ ๋์ง ์์๋ค. ์ฝ๋ฉํ ์คํธ๋ฅผ ์ํด์๋ผ๋ ๋์ ๋๋ฆฌ๋ฅผ ํํํ ์ฌ์ฉํ๋ฉฐ ์์ง ์๋๋ก ํด์ผ๊ฒ ๋ค. hash ์ด์ฉ ๋ฐฉ๋ฒ์ด ๋ฏ์ค์ด์ ์์ง์ ์ด๋ ค์์ด ์๋๊ฑฐ ๊ฐ๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ์ตํ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค์ด์ผ๊ฒ ๋ค.
Hash - ๋น ๋ฅธ ๊ฒ์ O(1)์ ์๋
ํด์๊ฐ ๋ฌด์? (์๋ฆฌ๊ฐ ๋ฌด์์ธ์ง?) what (๊ทธ๋์ ์, ์ธ์ ์ฌ์ฉํ๋์ง?) why when (๊ทธ๋์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง?) how
๋น ๋ฅธ ํ์์ ์ํ๊ฒ.. **DAT**๊ฐ ์์๋ค.
<DAT์ ํ๊ณ>
- DAT๋ ์์๋ ๋ถ๊ฐ ํ์! ๋ํ ๋ฌธ์์ด ์ ์ฅ๋ ๊ฒ๋ ๋ถ๊ฐ — ์ธ๋ฑ์คํ ์ํค๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์
- ๋ํ ๋ฉ๋ชจ๋ฆฌ์ ๋นํจ์จ
Direct Address Table์ upgradeํ!
- ํด์ฌ๋ DAT์ ํ๊ณ๋ฅผ ์ด๋ป๊ฒ ๊ทน๋ณตํ๋?
ํด์ํจ์ ์>
n=int(input()) # n๊ฐ์ ์ ์ ์
๋ ฅ
arr=list(map(int,input().split()))
bucket=[0]*10002
def hashf(key):
return key+100
for i in range(n):
hashcode=hashf(arr[i])
bucket[hashcode]=1
๊ทธ๋์ ์ซ์ ํ๋ ์ ๋ ฅ๋ฐ๊ณ ๊ทธ ์ซ์๊ฐ arr ๋ฐฐ์ด์์ ์กด์ฌ ํ๋์ง ํ์ธ ํ๊ณ ์ ํ๋ค๋ฉด?
target=int(input())
getcode=hashf(target) # ์
๋ ฅ๋ฐ์ ๊ฐ์ ํด์ฌ์ฝ๋๋ฅผ ์ป์ ํ
if bucket[getcode]==1: # dat ๊ฒ์
print("์์")
else: print("์์")
*ํ์ง๋ง... ํด์ฌํ์ ์ ์ด๋ป๊ฒ ๋ง๋ค์๋๋? ๋๋ key ๊ฐ์ด ๋ฌด์์ด๋์ ๋ฐ๋ผ์ ์ถฉ๋์ด ์ผ์ด๋จ(collision)*
์ถฉ๋์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- **์ฒด์ด๋ (linked list)** - c/c++ java
hash๋ ์ฒด์ด๋ ๋ ๊ฐฏ์๋ง ํ์ธํ๋ฉด ๋์ด์ O(n)์ ์๋๊ฐ ๋๋ค!
- **์คํ ์ด๋๋ ์ฑ** - ์ถฉ๋์ด ๋ฐ์ํ๋ฉด bucketํ ์ด๋ธ ์ ๋น๊ณต๊ฐ์ ์ฐพ์์ ํด๊ฒฐํจ์ผ๋ก ์คํ ์ด๋๋ ์ฑ ๊ฐ์ ๊ฒฝ์ฐ์๋ key์ ๋ฐ๋ฅธ value๊ฐ ์์ (key)์ ํด์์ฝ๋์ ์ผ์ฐจํ๋ ์ฃผ์์ ์ ์ฅํ์ง๋ ์๋๋ค. (๋ฃจ๋น ํ์ด์ฌ) ( ์คํ ์ด๋๋ ์ฑ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ ๋ฆฌ๋์ด ํ์ ๋ฐฉ์์ผ๋ก ์๋ฅผ ๋ค์ด ๋๋ฆผ)
์ค๋ณต์ด ๋์ด๋ฒ๋ฆฌ๋ฉด bucket๋ฐฐ์ด์ ๋น ๊ณต๊ฐ์ ์์์ ์๋ก hash์ฝ๋๋ฅผ ๋ง๋ค์ด ์ฃผ์ ๊ฐ์ ํ ๋น ๋ฐ์ ์๋ฆฌ๋ฅผ ์ก์ ์ฐ๊ฒฐ ์ํค๋ ๋ฐฉ๋ฒ
๊ทธ๋์ ๊ฒฐ๋ก . ํด์ ์ธ์ ์ฌ์ฉํ๋?
- **๋ฆฌ์คํธ ์ฌ์ฉํ ์ ์์๋ ** ๋ฆฌ์คํธ๋ ์ ์๊ฐ์ผ๋ก ๋ ์ธ๋ฑ์ค๋ก ์์์ ์ ๊ทผ ํ๋๋ฐ ์ธ๋ฑ์ค๊ฐ ๋ฌธ์์ด์ผ๋๋ ๋ถ๊ฐ๋ฅ
- **๋ฐ์ดํฐ์ ๋น ๋ฅธ ์ ๊ทผ ๋ฐ ํ์์ด ํ์ํ ๋** ๋น ๋ฅธ ํ์์ด ํ์ํ ๋ ์ฌ์ฉ (ํ์ด์ฌ์ ๋์ ๋๋ฆฌ๋ O(1)์ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํ์ํ๊ณ ์ญ์ ํ๋ค.) ๊ทธ๋์ ๋น ๋ฅธํ์๊ณผ ๋์์ ์ด๋ ํ ๋ฐ์ดํฐ๊ฐ ๋ช๊ฐ ์๋์ง ์ ๋
- **ํ๋ ๋ ๋ถ์ด์๋ฉด ๋ณด์์ ๊ฐํํ ๋! ** ๊ณต๊ณต์์ดํ์ด.. ๋ณด์์ ์๋นํ ์ทจ์ฝ..๋ง์ฝ์ ์ฌ๊ธฐ ์ ์ํ๋ค! ๊ทธ๋ฌ๋ฉด ์ด ๊ณต์ ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ก๋๋ ๋ฐ์ดํฐ๋ด์ฉ์ ๋ชจ๋ ๋ณผ์ ์๋ค. ์ด๋ค ์ฌ์ดํธ์ ์ ์ ํ๋์ง? ์์ด๋๋ ๋น๋ฒ์ ๋ฌด์์ ์ณค๋์ง ๋ค ํ์ธ ๋ ธ์ถ ๊ฐ๋ฅ
- ์นดํ์์ ์ ๊ณตํ๋ ์์ดํ์ด ์ด๋ฅธ๊ณผ ๋์ผํ๊ฑฐ๋ ๋น์ทํ ์ด๋ฆ์ผ๋ก ๊ฐ์ง ์์ดํ์ด ๋ง๋ ํ ์ฌ์ฉ์๊ฐ ์์ ์ ๊ณต์ ๊ธฐ์ ์ ์ํ๋๋ก ๊ธฐ๋ค๋ฆฐ๋ค.
๋๋ ์์ธ์ ๋ฑ์ ์งํ์ฒ ์ ๊ณต๊ณต ์์ดํ์ด์ ๊ณต์ ๊ธฐ์ ์ง์ ์ ๊ทผํ์ฌ(ํดํน)ํ์ฌ ๊ด๋ฆฌ์ ํ์ด์ง๋ฅผ ์กฐ์ ํ๊ธฐ๋ ํจ! ๊ทธ๋์ ์น์ฌ์ดํธ์์๋ ์ํธํ ๊ธฐ๋ฅ์ ์ง์ํ๋ค. ๋๋ ๊ณต๊ณต์ฅ์ ๊ณต์ ๊ธฐ์ ๊ด๋ฆฌ์ ํ์ด์ง๋ก ์ง์ ์ ๊ทผํด ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์์ดํ์ด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋นผ์ค๊ฑฐ๋ ์ ์ฑํ๋ก๊ทธ๋จ ์ค์น
Dictionary
- value์ถ๋ ฅ, value์์ ํน์ ๊ฐ ์ถ๋ ฅ, key๊ฐ์ด ์์ ๋ '์์!'์ถ๋ ฅํ๊ธฐ
dict1={}
dict2=dict()
hamster={'name':'๋ํ ๋ฆฌ','age':1,'weight':1}
animals={
'cat':{'name':'์ผ์น์ด','age':2,'weight':4,},
'dog':{'name':'๋๋์ด','age':12,'weight':8,},
}
print(animals['cat']) #value ์ถ๋ ฅ
print(animals['dog']['name']) #value์ name ์ถ๋ ฅ
# ํค์๋ฌ ๋ฐ์ get ์ฌ์ฉํ๋ฉด ์๋ฌ ๋ฐ์ํ์ง ์์
print(animals['cat'].get('nickname','์์!'))
# nickname์ด๋ผ๋ ํค๊ฐ ์์ผ๋ฉด ์์ ์ถ๋ ฅ
- ์๋ก์ด key,value ์ถ๊ฐํ๊ธฐ
dict1={}
dict2=dict()
hamster={'name':'๋ํ ๋ฆฌ','age':1,'weight':1}
animals={
'cat':{'name':'์ผ์น์ด','age':2,'weight':4,},
'dog':{'name':'๋๋์ด','age':12,'weight':8,},
}
#์๋ก์ด key,value์ถ๊ฐํ๊ธฐ
animals['hamster']= {'name':'ํ ํ ๋ฆฌ','age':1,'weight':1}
- ํน์ key๊ฐ ์ญ์ ํ๊ธฐ, ์๋ key๊ฐ์ด๋ฉด '์๋ key๊ฐ ์ถ๋ ฅ'
# ๋์
๋๋ฆฌ ๊ฐ ์ญ์ // 1. del 2. pop
dict1={}
dict2=dict()
hamster={'name':'๋ํ ๋ฆฌ','age':1,'weight':1}
animals={
'cat':{'name':'์ผ์น์ด','age':2,'weight':4,},
'dog':{'name':'๋๋์ด','age':12,'weight':8,},
'hamster':{'name':'ํ ํ ๋ฆฌ','age':1,'weight':1}
}
del animals['cat'] #์ญ์
print(animals)
# del animals['cat'] ์ ํ๋ฒ ๋ ํ๋ฉด key ๊ฐ์ด ์์ผ๋ฉด error
#์๋ ํค๊ฐ์ด๋ฉด '์๋ ํค๊ฐ'์ถ๋ ฅ
animals.pop('cat','์๋ ํค๊ฐ') # ์๋ ๊ณ ์์ด๋ฅผ ํ๋ฒ๋ ์ญ์ ์ pop ์ฌ์ฉํ๋ฉด error ์๋จ
print(animals.pop('cat','์์'))
# ๋์
๋๋ฆฌ์ ํด๋นํค๊ฐ ์์ผ๋ฉด key์๋ฌ๊ฐ ์๋๋ผ "์์" ๋ฐํํ๋ค.
# key ๊ฐ์ ๋ํ value๊ฐ ์์ผ๋ฉด value ๋ฐํ.. ๊ทธ๋ฐ๋ฐ value๊ฐ ์์ผ๋ฉด "์์" ๋ฐํ
# ๊ทธ๋์ ๋์
๋๋ฆฌ ์นด์ดํ
ํ ๋์ get ํจ์ ์ฌ์ฉํ์ธ์~
# ๋์
๋๋ฆฌ ์ ๋ถ ์ญ์
animals.clear()
print(animals)
- ํน์ key๊ฐ์ ํน์ value ๋ฐ๊พธ๊ธฐ
-
dict1={} dict2=dict() hamster={'name':'๋ํ ๋ฆฌ','age':1,'weight':1} animals={ 'cat':{'name':'์ผ์น์ด','age':2,'weight':4,}, 'dog':{'name':'๋๋์ด','age':12,'weight':8,}, 'hamster':{'name':'ํ ํ ๋ฆฌ','age':1,'weight':1} } #hamster์ age๋ฅผ ๋ฐ๊พธ๊ธฐ animals['hamster']['age'] = 101 #๋ฐ๊พผ hamster age๋ฅผ ์ถ๋ ฅํ๊ธฐ print(animals['hamster']['age'])
- key๊ฐ๋ง ์ถ๋ ฅ
#ํค๊ฐ๋ง ์ถ๋ ฅ
hamster={'name': 3,'age': 2,'weight': 1,}
#๋ฐฉ๋ฒ1
print(hamster.keys())
#๋ฐฉ๋ฒ2
for i in hamster.keys():
print(i,end=' ')
#๋ฐฉ๋ฒ3
for i in hamster:
print(i,end=' ')
print()
#๋ฐฉ๋ฒ4
list=(hamster.keys())
print(*list)
print()
- value๋ง ์ถ๋ ฅ
#value๋ง ์ถ๋ ฅ
hamster={'name': 3,'age': 2,'weight': 1,}
#๋ฐฉ๋ฒ1
for i in hamster.values():
print(i,end=' ')
print()
#๋ฐฉ๋ฒ2
print(hamster.values())
#๋ฐฉ๋ฒ3
list=hamster.values()
print(*list)
- key,value ์ถ๋ ฅ
-
hamster={'name': 3,'age': 2,'weight': 1,} #๋ฐฉ๋ฒ1 for i,j in hamster.items(): print(i,j) #๋ฐฉ๋ฒ2 # ๋ฆฌ์คํธ ์์ key์ value๊ฐ ํํ์ ํํ๋ก ์ ์ฅ๋จ print(hamster.items()) #๋ฐฉ๋ฒ3 for i in hamster.items(): print(*i, sep=':')
- key๊ฐ ์ ๋ ฌํ๊ธฐ(์ค๋ฆ์ฐจ์)
hamster={'name': 3,'age': 2,'weight': 1,}
#๋ฐฉ๋ฒ1
ham1=sorted(hamster.items(),key=lambda item:item[0])
# sorted ํจ์์ key ์ต์
์ lambda ๋ก ์ด์ฉ
# ์๊น์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฆฌ์คํธ ์์ key์ value๊ฐ ํํ์ ํํ๋ก ์ ์ฅ์ด ๋๋ค.
#๋ฐฉ๋ฒ2
list=ham1
for i in list:
for j in i:
print(j,end=' ')
print()
#๋ฐฉ๋ฒ3
ham2=sorted(hamster.items(),key=lambda item:item[1] )
list=ham2
for i in list:
for j in i:
print(j,end=' ')
print()
#๊ทธ ์ธ
print(sorted(hamster.items(), key=lambda x:x[0]))
print(sorted(hamster.items()))
- value๊ฐ ์ ๋ ฌํ๊ธฐ(๋ด๋ฆผ์ฐจ์)
#value ๊ฐ ์ ๋ ฌํ๊ธฐ(๋ด๋ฆผ์ฐจ์)
hamster={'name': 3,'age': 2,'weight': 1,}
# ๋ฐฉ๋ฒ 1
# -item[1] ์ ์์ ๋ถ์ด๊ธฐ
ham2=sorted(hamster.items(),key=lambda item:-item[1] )
# ๋ฐฉ๋ฒ 2
ham2=sorted(hamster.items(),key=lambda item:item[1],reverse=True )
print(sorted(hamster.items(),key=lambda x:-x[1]))#๋ด๋ฆผ์ฐจ์
์ฐ์ต
๋์ด - ๋ด๋ฆผ์ฐจ์, ๋ฌด๊ฒ - ์ค๋ฆ์ฐจ์!
#์ถ๋ ฅ์์
```
name ์ผ์น์ด
age 12
weight 4
name ๋๋์ด
age 12
weight 8
name ํ ํ ๋ฆฌ
age 1
weight 1
```
๋ต
# ๋์ด ๋ด๋ฆผ์ฐจ์ and ๋ฌด๊ฒ ์ค๋ฆ์ฐจ์
animals=[
{'name': '์ผ์น์ด','age': 12,'weight': 4,},
{'name': '๋๋์ด','age': 12,'weight': 8,},
{'name': 'ํ ํ ๋ฆฌ','age': 1,'weight': 1,}
]
sorted_animal = sorted(animals, key = lambda item : (-item['age'], item['weight']))
for k in range(3):
dict=sorted_animal[k]
for i,j in dict.items():
print(i,j)
animals.sort(key= lambda x: x["weight"])
animals.sort(key= lambda x: x["age"], reverse=True)
for a in animals:
print("name ", a['name'])
print("age ", a['age'])
print("weight ", a['weight']
- 4๊ฐ์ ํญ์ ๊ฐ๊ฐ n๊ฐ์ ์ซ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. (1<=n<1000)ํฉ์ด 0์ด ๋์ฌ ์ ์๋ ๊ฒฝ์ฐ๋ ๋ช๊ฐ์ง? - ์ ํ์๊ฐ 1์ด
- 4๊ฐ์ ํญ์์ ์ซ์ 1๊ฐ์ฉ์ ๋ฝ์์ ๋ชจ๋ ๋ํ์ ๋(์ซ์4๊ฐ๋ฅผ ๋ํ์ ๋)
A = [4,-1,-5,3,2,7]
B = [-4,-31,-5,1,2,3]
C = [24,-61,-5,5,2,-3]
D = [54,-91,-5,6,2,7]
AB = [0]*200
CD = [0]*200
answer = 0
# A,B ์ ํฉ๋ค
for i in range(len(A)):
for j in range(len(B)):
AB[A[i]+B[j]+100] += 1
# C,D์ ํฉ๋ค
for i in range(len(C)):
for j in range(len(D)):
CD[C[i]+D[j]+100] += 1
for i in range(200):
if AB[i] > 0:
if CD[200-i] > 0:
answer += AB[i]*CD[200-i]
print(answer) #20
- ํฌํฌ์ธํฐ๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
n = int(input())
A, B, C, D = [], [], [], []
for _ in range(n):
a, b, c, d = map(int, input().split())
A.append(a)
B.append(b)
C.append(c)
D.append(d)
# ํฌ ํฌ์ธํฐ ์ฌ์ฉํ๊ธฐ ์ํด AB์ CD๋ก ๋ฌถ์ด์ ์ ๋ ฌ
AB_sum = sorted([a+b for a in A for b in B])
CD_sum = sorted([c+d for c in C for d in D])
# ๊ฐ์ง ์, left pointer ์ด๊ธฐ ๊ฐ, right pointer ์ด๊ธฐ ๊ฐ
sol, left_p, right_p = 0, 0, len(CD_sum) - 1
while left_p < len(CD_sum) and right_p > -1:
# ํ์ฌ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ํฉ
now_sum = AB_sum[left_p] + CD_sum[right_p]
# 0์ ๊ธฐ์ค์ผ๋ก ํ์ธ
if now_sum < 0:
left_p += 1
elif now_sum > 0:
right_p -= 1
else:
# ์ฐ์์ผ๋ก ๊ฐ์ ๊ฐ์ด ๋์ฌ ๊ฒฝ์ฐ
l_move = 1
r_move = 1
while True:
if left_p < len(AB_sum)-1 and AB_sum[left_p] == AB_sum[left_p + 1]:
l_move += 1
left_p += 1
elif right_p > 0 and CD_sum[right_p] == CD_sum[right_p - 1]:
r_move += 1
right_p -= 1
else:
sol += l_move*r_move
left_p += 1
right_p -= 1
break
print(sol)
n=6
A=[4, -1, -5, 3, 2, 7]
B=[-4, -31, -5, 1, 2, 3]
C=[24, -61, -5, 5, 2, -3]
D=[54, -91, -5, 6, 2, 7]
bucket1_plus=[0]*201
bucket1_minus=[0]*201
bucket2_plus=[0]*201
bucket2_minus=[0]*201
cnt=0
for i in range(len(A)):
for j in range(len(B)):
if A[i]+B[j]>=0:
bucket1_plus[A[i]+B[j]] +=1
else:
bucket1_minus[-(A[i]+B[j])]+=1
for i in range(len(C)):
for j in range(len(D)):
if C[i]+D[j]>0:
bucket2_plus[C[i]+D[j]] +=1
else:
bucket2_minus[-(C[i]+D[j])]+=1
for i in range(201):
for j in range(201):
if bucket1_plus[i] != 0 and bucket2_minus[j] !=0:
if i-j==0:
cnt+= bucket1_plus[i]*bucket2_minus[j]
for i in range(201):
for j in range(201):
if bucket2_plus[i] != 0 and bucket1_minus[j] != 0:
if i - j == 0:
cnt += bucket2_plus[i]*bucket1_minus[j]
print(cnt)
'๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.04.06.์ (0) | 2022.04.06 |
---|---|
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.04.05.ํ (0) | 2022.04.06 |
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.03.31.๋ชฉ (0) | 2022.03.31 |
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.03.30.์ (0) | 2022.03.30 |
๐๐จ๐๐๐ฒ ๐ ๐๐๐๐ซ๐ง 2022.03.29.ํ (0) | 2022.03.30 |
๋๊ธ