Algorithm

[λ°±μ€€/Python] 1501. μ˜μ–΄ 읽기

bba_dda 2021. 10. 6. 18:40
λ°˜μ‘ν˜•

문제

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

 

1501번: μ˜μ–΄ 읽기

첫째 쀄에 사전에 μžˆλŠ” λ‹¨μ–΄λ“€μ˜ 개수 N(0 ≤ N ≤ 10,000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” 각 쀄에 ν•˜λ‚˜μ”©, μ˜μ–΄ 사전에 μžˆλŠ” 단어듀이 μ£Όμ–΄μ§„λ‹€. 각 λ‹¨μ–΄μ˜ κΈΈμ΄λŠ” 100자λ₯Ό λ„˜μ§€ μ•ŠλŠ”λ‹€. λ‹€μŒ 쀄에

www.acmicpc.net

풀이

λ¬Έμž₯을 해석할 수 μžˆλŠ” 경우의 수λ₯Ό ꡬ해야 ν•œλ‹€. 

λ¬Έμž₯을 곡백을 κΈ°μ€€μœΌλ‘œ μž˜λΌμ„œ λ‹¨μ–΄λ“€λ‘œ λ§Œλ“€μ—ˆλ‹€.

각 단어듀은 맨 μ•žκ³Ό 맨 λ’· κΈ€μžλ₯Ό μ œμ™Έν•˜κ³  μˆœμ„œλ₯Ό λ°”κΎΈμ–΄ λ‹€μ–‘ν•œ 경우의 수λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. 

이 경우의 수 쀑에 μ‚¬μ „μ—μ„œ 찾을 수 μžˆλŠ” 경우의 μˆ˜κ°€ ν•„μš”ν•˜λ‹€. 

 

쀑간에 ν—·κ°ˆλ Έλ˜ 점은, 

μ–΄λ–€  λ¬Έμž₯이 3개의 λ‹¨μ–΄λ‘œ κ΅¬μ„±λ˜μ–΄ 있고, 각각 2κ°€μ§€, 0κ°€μ§€, 3κ°€μ§€λ‘œ 해석될 수 μžˆλŠ” κ²½μš°μ— 

2*0*3 = 0이 μ•„λ‹ˆλΌ, 0은 μ—†λŠ” μ…ˆ 치고 2*3 = 6이 닡이 λœλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€. 

 

자료ꡬ쑰둜 dictλ₯Ό μ΄μš©ν•˜μ˜€λŠ”λ°, keyλ₯Ό "(λ§¨μ•žκΈ€μž)(λ§¨λ’·κΈ€μž)(κ°€μš΄λ°λ¬Έμžλ“€μ •λ ¬)"둜 μ΄μš©ν•˜μ˜€λ‹€. 

예λ₯Όλ“€μ–΄ "befakdf" λŠ” "bfadefk"κ°€ λœλ‹€. 

λ”°λΌμ„œ, 사전에 "abec"와 "aebc"κ°€ μžˆλ‹€λ©΄ 이 λ‘˜μ˜ keyλŠ” κ°™λ‹€. 

κ·Έλž˜μ„œ valueλŠ” ν•΄λ‹Ή keyκ°€ λ“±μž₯ν•œ 횟수λ₯Ό λ„£μ–΄μ£Όμ—ˆλ‹€. 

 

사전을 λͺ¨λ‘ λ§Œλ“  후에 

 

λ¬Έμž₯에 μžˆλŠ” 단어듀을 dictμ—μ„œ keyλ₯Ό λ§Œλ“  방법과 λ™μΌν•˜κ²Œ λ§Œλ“€μ–΄μ„œ, μ‚¬μ „μ—μ„œ valueλ₯Ό μ‘°νšŒν•œ λ’€ valueκ°€ 0이 아닐 κ²½μš°μ—λ§Œ κ³±ν•΄μ£Όμ—ˆλ‹€. 

 

* μœ„μ—μ„œ keyλ₯Ό λ§Œλ“œλŠ” λ°©λ²•μ—μ„œ, 1κΈ€μžμ™€ 2κΈ€μžμ§œλ¦¬λŠ” if둜 κ²€μ‚¬ν•΄μ„œ λ”°λ‘œ keyλ₯Ό λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€. 

μ½”λ“œ

from collections import defaultdict
dic = defaultdict(dict)

N = int(input())
for i in range(N):
    word = input()
    if (len(word) <= 2):
        try : dic[word]['']+=1
        except : dic[word]['']=1
    else:
        first_k = word[0]+word[-1]
        sec_k = str(sorted(word[1:-1]))
        try : dic[first_k][sec_k]+=1
        except : dic[first_k][sec_k]=1
        
M = int(input())
for i in range(M):
    sen = input().split(' ')
    count = 1
    isCan = False
    for idx, w in enumerate(sen):
        temp = 0
        if (len(w) <= 2):
            try :temp += dic[w]['']
            except: temp
        else:
            start = w[0]
            end = w[-1]
            middle = str(sorted(w[1:-1]))
            try: temp+= dic[start+end][middle]
            except: temp
        if temp != 0:
            count*=temp
            isCan = True
    if not isCan:
        count = 0
    print(count)

python으둜 μ–΄λ €μš΄ 문제λ₯Ό ν‘ΈλŠ” 것이 처음이라 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜λŠ” 뢀뢄을 ꡉμž₯히 ν—€λ§Έλ‹€. 

κ²°κ³Ό

λ°˜μ‘ν˜•