[python] νλ‘κ·Έλλ¨Έμ€ - κ°μ¬ κ²μ(2020 KAKAO BLIND RECRUITMENT)
π€λ¬Έμ ν΄κ²°
1. Lv4... | νΈλΌμ΄ μλ£κ΅¬μ‘°
2. νΈλΌμ΄ μλ£κ΅¬μ‘°λ₯Ό ꡬμ±νλ€.( μ½κ² λ§νμλ©΄ dictμμ dictμμ dictμμ dict.... ꡬ쑰 )
λλ΅ μμ κ·Έλ¦Όκ³Ό κ°μ ννλ‘ κ΅¬μ±νκ² λλ€. 맨 μμ μ«μλ κΈΈμ΄κ° 5μΈ λ¨μ΄, 6μΈ λ¨μ΄
λ€μ fλ‘ μμνλ λ¨μ΄ 4κ°, rλ‘μμνλ λ¨μ΄ 4κ°, oλ‘ μμνλ λ¨μ΄3κ°, dλ‘ μμνλ λ¨μ΄ 1κ°... κ° μλ€λ μλ―Έ
4. μ°Ύλλ€...
λ§μ½ 'fro??' μ μ°Ύλλ€κ³ νμ
(1) κΈΈμ΄κ° 5 μΈ κ³³μΌλ‘ λ€μ΄κ°λ€
(2) κ±°κΈ°μ f λ‘ λ€μ΄κ°λ€. cntμλ fλ‘ μμνλ λ¨μ΄κ° 4κ°μλ€λ κ²μ μ μ₯νλ€.
(3) r λ‘ λ€μ΄κ°λ€. cntμλ rλ‘ μμνλ λ¨μ΄κ° 4κ° μλ€λ κ²μ μ μ₯νλ€.
(4) o λ‘ λ€μ΄κ°λ€. cntμλ oλ‘ μμνλ λ¨μ΄κ° 3κ° μλ€λ κ²μ μ μ₯νλ€.
(5) ? λ₯Ό λ§λλ©΄ cnt λ₯Ό 리ν΄.
(6) fro λ‘ μμνλ©΄μ κΈΈμ΄κ° 5μΈ λ¨μ΄λ λ§μ§λ§μ μ μ₯λ 3κ°μ΄λ€.
π¨ !!Tipνμ§λ§ μ΄λ κ²λ§ νλ©΄ ν¨μ¨μ± 3λ²μμ νλ¦°λ€. μ΄μ λ μΏΌλ¦¬κ° λͺ¨λ '?'λ‘ κ΅¬μ±λ κ²½μ°κ° μκΈ° λλ¬Έ!!!!
ν΄κ²°λ²: λ¨μ΄μ κΈΈμ΄λ μ΅λ 1λ§κΉμ§μ΄λ€. 1λ§κΉμ§μ λ°°μ΄μ λ§λ€κ³ , κ° λ¨μ΄μ κΈΈμ΄λ§λ€ λͺκ°μΈμ§ μ μ₯
μΏΌλ¦¬κ° λͺ¨λ '?'λ‘ κ΅¬μ±λ λ¨μ΄κ° λμ€λ©΄ μ°Ύμ§λ§κ³ 리μ€νΈμ μ μ₯ν΄λ κ°―μλ₯Ό κΊΌλΈλ€.
π νΈλΌμ΄ ꡬ쑰λ₯Ό μ΄μ©νμ§ μκ³ λ¬Έμλ₯Ό μλΌμ νλνλ μ°Ύμμ€λ ν¨μ¨μ± 3λ²λΉΌκ³ λ€ μ°Ύμ μλ μλ€.
( len('asdf') λ νλ²μ μΈνκ³ κ·Έ κ°μ μ¨μ£Όμ. κ³μ μ λ κ² λΆλ¬μ€λ©΄ ν¨μ¨ μμ’λ€.
λ§μ½ μκ°μ΄ μκ³ νΈλΌμ΄κ΅¬μ‘°λ₯Ό λͺ¨λ₯Έλ€λ©΄ λΆλΆμ μλΌλ μ±κ²¨λ³΄μ
π»μμ€ μ½λ
from collections import defaultdict
from collections import deque
def insert(part_trie, word):
copy_trie = part_trie
q = deque(list(word))
while q:
char = q.popleft()
if char not in copy_trie:
copy_trie[char] = [0, {}]
copy_trie[char][0] += 1
copy_trie = copy_trie[char][1]
def find(trie, query):
cnt = 0
copy_trie = trie
if len(copy_trie) == 0:
return 0
q = deque(list(query))
while q:
char = q.popleft()
if char == "?":
return cnt
else:
if char not in copy_trie:
return 0
cnt = copy_trie[char][0]
copy_trie = copy_trie[char][1]
return cnt
def solution(words, queries):
answer = []
# νΈλΌμ΄ μλ£κ΅¬μ‘° νμ©νκΈ°!
trie = defaultdict(dict)
reversed_trie = defaultdict(dict)
# !!!μΏΌλ¦¬κ° λͺ¨λ λ¬ΌμνμΈ κ²½μ° μκ° μ΄κ³Όκ° λ°μνλ―λ‘, λ¬Έμ κΈΈμ΄μ λ°λΌ κ°―μ μ μ₯
length_list = [0] * 10001
# trie λ§λ€κΈ°
for word in words:
length_word = len(word)
length_list[length_word] += 1
insert(trie[length_word], word)
insert(reversed_trie[length_word], word[::-1])
# μ°ΎκΈ°
for query in queries:
length_query = len(query)
if query.count('?') == length_query: # μΏΌλ¦¬κ° λͺ¨λ λ¬ΌμνμΈ κ²½μ°
answer.append(length_list[length_query])
continue
if query[0] == "?": # λ¬Όμνλ‘ μμνλ 쿼리
answer.append(find(reversed_trie[length_query], query[::-1]))
else:
answer.append(find(trie[length_query], query))
return answer
qqq = [
[["frodo", "front", "frost", "frozen", "frame", "kakao"], ["fro??", "????o", "fr???", "fro???", "pro?"]]
]
for q1, q2 in qqq:
print(solution(q1, q2))
πλ¬Έμ νμΈ
μΆμ²: νλ‘κ·Έλλ¨Έμ€
λ§ν¬: https://programmers.co.kr/learn/courses/30/lessons/60060
μ½λ©ν μ€νΈ μ°μ΅ - κ°μ¬ κ²μ
programmers.co.kr
λ¬Έμ μ€λͺ
[λ³Έ λ¬Έμ λ μ νμ±κ³Ό ν¨μ¨μ± ν μ€νΈ κ°κ° μ μκ° μλ λ¬Έμ μ λλ€.]
μΉκ΅¬λ€λ‘λΆν° μ²μ¬ νλ‘κ·Έλλ¨Έλ‘ λΆλ¦¬λ νλ‘λλ μμ
μ νλ μΉκ΅¬λ‘λΆν° μμ μ΄ μ’μνλ λ
Έλ κ°μ¬μ μ¬μ©λ λ¨μ΄λ€ μ€μ νΉμ ν€μλκ° λͺ κ° ν¬ν¨λμ΄ μλμ§ κΆκΈνλ νλ‘κ·Έλ¨μΌλ‘ κ°λ°ν΄ λ¬λΌλ μ μμ λ°μμ΅λλ€.
κ·Έ μ μ μ¬ν μ€, ν€μλλ μμΌλμΉ΄λ λ¬Έμμ€ νλμΈ '?'κ° ν¬ν¨λ ν¨ν΄ ννμ λ¬Έμμ΄μ λ»ν©λλ€. μμΌλμΉ΄λ λ¬ΈμμΈ '?'λ κΈμ νλλ₯Ό μλ―Ένλ©°, μ΄λ€ λ¬Έμμλ 맀μΉλλ€κ³ κ°μ ν©λλ€. μλ₯Ό λ€μ΄ "fro??"λ "frodo", "front", "frost" λ±μ 맀μΉλμ§λ§ "frame", "frozen"μλ 맀μΉλμ§ μμ΅λλ€.
κ°μ¬μ μ¬μ©λ λͺ¨λ λ¨μ΄λ€μ΄ λ΄κΈ΄ λ°°μ΄ wordsμ μ°Ύκ³ μ νλ ν€μλκ° λ΄κΈ΄ λ°°μ΄ queriesκ° μ£Όμ΄μ§ λ, κ° ν€μλ λ³λ‘ 맀μΉλ λ¨μ΄κ° λͺ κ°μΈμ§ μμλλ‘ λ°°μ΄μ λ΄μ λ°ννλλ‘ solution ν¨μλ₯Ό μμ±ν΄ μ£ΌμΈμ.
κ°μ¬ λ¨μ΄ μ νμ¬ν
- wordsμ κΈΈμ΄(κ°μ¬ λ¨μ΄μ κ°μ)λ 2 μ΄μ 100,000 μ΄νμ λλ€.
- κ° κ°μ¬ λ¨μ΄μ κΈΈμ΄λ 1 μ΄μ 10,000 μ΄νλ‘ λΉ λ¬Έμμ΄μΈ κ²½μ°λ μμ΅λλ€.
- μ 체 κ°μ¬ λ¨μ΄ κΈΈμ΄μ ν©μ 2 μ΄μ 1,000,000 μ΄νμ λλ€.
- κ°μ¬μ λμΌ λ¨μ΄κ° μ¬λ¬ λ² λμ¬ κ²½μ° μ€λ³΅μ μ κ±°νκ³ wordsμλ νλλ‘λ§ μ 곡λ©λλ€.
- κ° κ°μ¬ λ¨μ΄λ μ€μ§ μνλ²³ μλ¬Έμλ‘λ§ κ΅¬μ±λμ΄ μμΌλ©°, νΉμλ¬Έμλ μ«μλ ν¬ν¨νμ§ μλ κ²μΌλ‘ κ°μ ν©λλ€.
κ²μ ν€μλ μ νμ¬ν
- queriesμ κΈΈμ΄(κ²μ ν€μλ κ°μ)λ 2 μ΄μ 100,000 μ΄νμ λλ€.
- κ° κ²μ ν€μλμ κΈΈμ΄λ 1 μ΄μ 10,000 μ΄νλ‘ λΉ λ¬Έμμ΄μΈ κ²½μ°λ μμ΅λλ€.
- μ 체 κ²μ ν€μλ κΈΈμ΄μ ν©μ 2 μ΄μ 1,000,000 μ΄νμ λλ€.
- κ²μ ν€μλλ μ€λ³΅λ μλ μμ΅λλ€.
- κ° κ²μ ν€μλλ μ€μ§ μνλ²³ μλ¬Έμμ μμΌλμΉ΄λ λ¬ΈμμΈ '?' λ‘λ§ κ΅¬μ±λμ΄ μμΌλ©°, νΉμλ¬Έμλ μ«μλ ν¬ν¨νμ§ μλ κ²μΌλ‘ κ°μ ν©λλ€.
- κ²μ ν€μλλ μμΌλμΉ΄λ λ¬ΈμμΈ '?'κ° νλ μ΄μ ν¬ν¨λΌ μμΌλ©°, '?'λ κ° κ²μ ν€μλμ μ λμ¬ μλλ©΄ μ λ―Έμ¬ μ€ νλλ‘λ§ μ£Όμ΄μ§λλ€.
- μλ₯Ό λ€μ΄ "??odo", "fro??", "?????"λ κ°λ₯ν ν€μλμ λλ€.
- λ°λ©΄μ "frodo"('?'κ° μμ), "fr?do"('?'κ° μ€κ°μ μμ), "?ro??"('?'κ° μμͺ½μ μμ)λ λΆκ°λ₯ν ν€μλμ λλ€.
μ μΆλ ₯ μ
wordsqueriesresult
["frodo", "front", "frost", "frozen", "frame", "kakao"] | ["fro??", "????o", "fr???", "fro???", "pro?"] | [3, 2, 4, 1, 0] |
μ μΆλ ₯ μμ λν μ€λͺ
- "fro??"λ "frodo", "front", "frost"μ 맀μΉλλ―λ‘ 3μ λλ€.
- "????o"λ "frodo", "kakao"μ 맀μΉλλ―λ‘ 2μ λλ€.
- "fr???"λ "frodo", "front", "frost", "frame"μ 맀μΉλλ―λ‘ 4μ λλ€.
- "fro???"λ "frozen"μ 맀μΉλλ―λ‘ 1μ λλ€.
- "pro?"λ 맀μΉλλ κ°μ¬ λ¨μ΄κ° μμΌλ―λ‘ 0 μ λλ€.