๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง 2022.04.04.์›”

by DevIseo 2022. 4. 4.

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)*

์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•


  1. **์ฒด์ด๋‹ (linked list)** - c/c++ java

hash๋Š” ์ฒด์ด๋‹ ๋œ ๊ฐฏ์ˆ˜๋งŒ ํ™•์ธํ•˜๋ฉด ๋˜์–ด์„œ O(n)์˜ ์†๋„๊ฐ€ ๋‚œ๋‹ค!

  1. **์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ** - ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด bucketํ…Œ์ด๋ธ” ์˜ ๋นˆ๊ณต๊ฐ„์„ ์ฐพ์•„์„œ ํ•ด๊ฒฐํ•จ์œผ๋กœ ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” key์— ๋”ฐ๋ฅธ value๊ฐ€ ์ž์‹ (key)์˜ ํ•ด์‹œ์ฝ”๋“œ์— ์ผ์ฐจํ•˜๋Š” ์ฃผ์†Œ์— ์ €์žฅํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. (๋ฃจ๋น„ ํŒŒ์ด์ฌ) ( ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๋ฆฌ๋‹ˆ์–ด ํƒ์ƒ‰ ๋ฐฉ์‹์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด ๋“œ๋ฆผ)

์ค‘๋ณต์ด ๋˜์–ด๋ฒ„๋ฆฌ๋ฉด bucket๋ฐฐ์—ด์˜ ๋นˆ ๊ณต๊ฐ„์— ์•Œ์•„์„œ ์ƒˆ๋กœ hash์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์†Œ ๊ฐ’์„ ํ• ๋‹น ๋ฐ›์•„ ์ž๋ฆฌ๋ฅผ ์žก์•„ ์—ฐ๊ฒฐ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

 

 

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก . ํ•ด์‹œ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ƒ?


  1. **๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉํ• ์ˆ˜ ์—†์„๋•Œ ** ๋ฆฌ์ŠคํŠธ๋Š” ์ •์ˆ˜๊ฐ’์œผ๋กœ ๋œ ์ธ๋ฑ์Šค๋กœ ์›์†Œ์— ์ ‘๊ทผ ํ•˜๋Š”๋ฐ ์ธ๋ฑ์Šค๊ฐ€ ๋ฌธ์ž์—ด์ผ๋•Œ๋Š” ๋ถˆ๊ฐ€๋Šฅ
  2. **๋ฐ์ดํ„ฐ์— ๋น ๋ฅธ ์ ‘๊ทผ ๋ฐ ํƒ์ƒ‰์ด ํ•„์š”ํ• ๋•Œ** ๋น ๋ฅธ ํƒ์ƒ‰์ด ํ•„์š”ํ• ๋•Œ ์‚ฌ์šฉ (ํŒŒ์ด์ฌ์˜ ๋”•์…”๋„ˆ๋ฆฌ๋Š” O(1)์˜ ์†๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ํƒ์ƒ‰ํ•˜๊ณ  ์‚ญ์ œํ•œ๋‹ค.) ๊ทธ๋ž˜์„œ ๋น ๋ฅธํƒ์ƒ‰๊ณผ ๋™์‹œ์— ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡๊ฐœ ์žˆ๋Š”์ง€ ์…€๋•Œ
  3. **ํ•˜๋‚˜ ๋” ๋ถ™์ด์ž๋ฉด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ• ๋•Œ! ** ๊ณต๊ณต์™€์ดํŒŒ์ด.. ๋ณด์•ˆ์— ์ƒ๋‹นํžˆ ์ทจ์•ฝ..๋งŒ์•ฝ์— ์—ฌ๊ธฐ ์ ‘์†ํ–ˆ๋‹ค! ๊ทธ๋Ÿฌ๋ฉด ์ด ๊ณต์œ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ณผ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค ์‚ฌ์ดํŠธ์— ์ ‘์† ํ–ˆ๋Š”์ง€? ์•„์ด๋””๋ž‘ ๋น„๋ฒˆ์€ ๋ฌด์—‡์„ ์ณค๋Š”์ง€ ๋‹ค ํ™•์ธ ๋…ธ์ถœ ๊ฐ€๋Šฅ
  4. ์นดํŽ˜์—์„œ ์ œ๊ณตํ•˜๋Š” ์™€์ดํŒŒ์ด ์ด๋ฅธ๊ณผ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋น„์Šทํ•œ ์ด๋ฆ„์œผ๋กœ ๊ฐ€์งœ ์™€์ดํŒŒ์ด ๋งŒ๋“ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๊ณต์œ ๊ธฐ์— ์ ‘์†ํ•˜๋„๋ก ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

๋˜๋Š” ์„œ์šธ์‹œ ๋“ฑ์˜ ์ง€ํ•˜์ฒ ์˜ ๊ณต๊ณต ์™€์ดํŒŒ์ด์˜ ๊ณต์œ ๊ธฐ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ(ํ•ดํ‚น)ํ•˜์—ฌ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ์กฐ์ •ํ•˜๊ธฐ๋„ ํ•จ! ๊ทธ๋ž˜์„œ ์›น์‚ฌ์ดํŠธ์—์„œ๋Š” ์•”ํ˜ธํ™” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ๋˜๋Š” ๊ณต๊ณต์žฅ์†Œ ๊ณต์œ ๊ธฐ์˜ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋กœ ์ง์ ‘ ์ ‘๊ทผํ•ด ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์™€์ดํŒŒ์ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋นผ์˜ค๊ฑฐ๋‚˜ ์•…์„ฑํ”„๋กœ๊ทธ๋žจ ์„ค์น˜

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)

๋Œ“๊ธ€