728x90
๐๏ธ ๋ฌธ์
2020 KAKAO BLIND RECRUITMENT_๊ฐ์ฌ ๊ฒ์


๐ Point
ํธ๋ผ์ด(Trie) ์๋ฃ๊ตฌ์กฐ
- ๋จ์ด์ ๊ธธ์ด๋ณ๋ก Trie ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ ํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ค.
- ์ ๋ฐฉํฅ Trie์ ์ญ๋ฐฉํฅ Trie๋ฅผ ๋์์ ์ด๊ธฐํํ๊ณ ๋จ์ด๋ฅผ ์ฝ์
ํ๋ค.
- ์ ๋ฐฉํฅ Trie : ์ ๋ฏธ์ฌ์ "?"๊ฐ ์์ ๋ ์ฌ์ฉ
- ์ญ๋ฐฉํฅ Trie : ์ ๋์ฌ์ "?"๊ฐ ์์ ๋ ์ฌ์ฉ
๐ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์
๐ ์ ๋ ฅ ๋จ์ด
words = ["apple", "app", "bat"]
๐ ๊ธธ์ด๋ณ Trie ์ด๊ธฐํ
# ์ ๋ฐฉํฅ Trie (tries)
tries = {
3: Trie(), # 3๊ธ์ ๋จ์ด์ฉ Trie
5: Trie() # 5๊ธ์ ๋จ์ด์ฉ Trie
}
# ์ญ๋ฐฉํฅ Trie (tries_reverse)
tries_reverse = {
3: Trie(),
5: Trie()
}
๐ ์ ๋ฐฉํฅ Trie ๊ตฌ์ฑ
- tries[3]์ "app", "bat" ์ฝ์ .
- tries[5]์ "apple" ์ฝ์ .
Trie ๊ตฌ์กฐ (์ ๋ฐฉํฅ, ๊ธธ์ด 3)
(root)
/ \
a b
| |
p a
| |
p t
Trie ๊ตฌ์กฐ (์ ๋ฐฉํฅ, ๊ธธ์ด 5)
(root)
|
a
|
p
|
p
|
l
|
e
๐ ์ญ๋ฐฉํฅ Trie ๊ตฌ์ฑ
- tries_reverse[3]์ "ppa", "tab" ์ฝ์ .
- tries_reverse[5]์ "elppa" ์ฝ์ .
Trie ๊ตฌ์กฐ (์ ๋ฐฉํฅ, ๊ธธ์ด 3)
(root)
/ \
p t
| |
p a
| |
a b
Trie ๊ตฌ์กฐ (์ ๋ฐฉํฅ, ๊ธธ์ด 5)
(root)
|
e
|
l
|
p
|
p
|
a
๐ ์ฝ๋
class TrieNode:
def __init__(self):
self.children = {} # ์์ ๋
ธ๋๋ฅผ ์ ์ฅํ ๋์
๋๋ฆฌ
self.count = 0 # ํ์ฌ ๋
ธ๋๋ฅผ ๊ฒฝ์ ํ๋ ๋จ์ด์ ์
class Trie:
def __init__(self):
self.root = TrieNode() # ๋ฃจํธ ๋
ธ๋ ์ด๊ธฐํ
def insert(self, word):
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.count += 1
def count_match(self, query):
# ์ ์ฒด๊ฐ "?"์ธ ๊ฒฝ์ฐ, ๋ฃจํธ์ count๋ฅผ ๋ฐํํ๋ค.
if set(query) == {'?'}:
return self.root.count
node = self.root
for char in query:
if char == '?':
break
if char not in node.children:
return 0
node = node.children[char]
return node.count if node else 0
def solution(words, queries):
tries = {} # ์ ๋ฐฉํฅ Trie
tries_reverse = {} # ์ญ๋ฐฉํฅ Trie
length_words = {} # ๊ธธ์ด๋ณ ๋จ์ด ๊ฐ์ ์ ์ฅ. {'๊ธธ์ด' : ๊ฐ์}
# ๋จ์ด๋ค์ ์ ๋ฐฉํฅ ๋ฐ ์ญ๋ฐฉํฅ Trie์ ์ฝ์
for word in words:
length = len(word)
# ๊ธธ์ด๋ณ ๋จ์ด ๊ฐ์ ์ ์ฅ
length_words[length] = length_words.get(length, 0) + 1
if length not in tries:
tries[length] = Trie()
tries_reverse[length] = Trie()
tries[length].insert(word)
tries_reverse[length].insert(word[::-1])
# ๊ฐ ์ฟผ๋ฆฌ์ ๋ํด ๋งค์นญ๋๋ ๋จ์ด ์ ๊ณ์ฐ
result = []
for query in queries:
length = len(query)
# ์ ๋ถ "?"๋ก ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ
if set(query) == {'?'}:
result.append(length_words.get(length, 0))
continue
# ์ ๋์ฌ์ "?"๊ฐ ์๋ ๊ฒฝ์ฐ
if query[0] == '?':
if length not in tries_reverse:
result.append(0)
continue
reversed_query = query[::-1]
match_count = tries_reverse[length].count_match(reversed_query)
result.append(match_count)
# ์ ๋ฏธ์ฌ์ "?"๊ฐ ์๋ ๊ฒฝ์ฐ
else:
if length not in tries:
result.append(0)
continue
match_count = tries[length].count_match(query)
result.append(match_count)
return result
โ๐ป ํ์ด
์๊ฐ ๋ณต์ก๋ : O(NM + QM)
N: ๋จ์ด์, M: ๋จ์ด ๊ธธ์ด, Q: ์ฟผ๋ฆฌ ์
- ํด๋์ค ๊ตฌ์กฐ
- Class : TrieNode
- Node
- children : ๋ค์ ๋ฌธ์๋ก ์ฐ๊ฒฐ๋๋ ์์ ๋ ธ๋๋ฅผ ์ ์ฅํ๋ ๋์ ๋๋ฆฌ
- count : ํด๋น ๋ ธ๋๊น์ง ์ค๋ ๋จ์ด์ ๊ฐ์๋ฅผ ์ ์ฅ
- Node
- Class : Trie
- ํธ๋ผ์ด์ root ๋ ธ๋๋ฅผ ์ด๊ธฐํํ๋ค.
- insert(word) : ๋จ์ด๋ฅผ ํธ๋ผ์ด์ ์ฝ์
ํ๋ค.
- ๊ฐ ๋ฌธ์๋ง๋ค ๋ ธ๋๋ฅผ ์์ฑํ๊ณ ํด๋น ๊ฒฝ๋ก์ count๋ฅผ 1์ฉ ์ฆ๊ฐํ๋ค.
- count_match(query) : ์ฟผ๋ฆฌ์ ๋งค์นญ๋๋ ๋จ์ด์ ์๋ฅผ ๋ฐํํ๋ค.
- query๊ฐ "?"๋ก๋ง ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ, ํด๋น ๊ธธ์ด์ ๋จ์ด ๊ฐ์๋ฅผ ๋ฐ๋ก ๋ฐํ
- "?" ๋ฌธ์๊ฐ ๋์ค๋ฉด query ๋ฌธ์ ํ์์ ์ค๋จ โ ๋ ธ๋์ count๋ฅผ ๋ฐํํ์ฌ ๋จ์ด ์ ๊ณ์ฐ
- Class : TrieNode
- ๋จ์ด ์ฒ๋ฆฌ
- ๊ธธ์ด๋ณ๋ก ๋จ์ด๋ฅผ ์ฒ๋ฆฌ
- ๋จ์ด์ ๊ธธ์ด๋ฅผ ํค(length)๋ก ํ์ฌ Trie๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ค.
- tries : ์ ๋ฐฉํฅ Trie
- tries_reverse : ์ญ๋ฐฉํฅ Trie
- Trie์ ๋จ์ด ์ฝ์
- (์ ๋ฐฉํฅ) ๋ฌธ์์ด ๊ทธ๋๋ก
- (์ญ๋ฐฉํฅ) ๋ฌธ์์ด ๋ค์ง์ด์
- ์ฟผ๋ฆฌ ์ฒ๋ฆฌ
- ์ ๋ถ "?"์ธ ๊ฒฝ์ฐ
- length_words์์ ํด๋น ๊ธธ์ด์ ๋จ์ด ๊ฐ์๋ฅผ ๋ฐ๋ก ๋ฐํํ๋ค.
- "?"๊ฐ ์์ ๋ถ๋ ๊ฒฝ์ฐ (์ ๋์ฌ)
- ์ญ๋ฐฉํฅ ํธ๋ผ์ด(tries_reverse) ์ฌ์ฉ
- ์ฟผ๋ฆฌ๋ฅผ ๋ค์ง์ด "?"๊ฐ ๋ค์ ์์นํ๋๋ก ํ๋ค.
- ์๋ฅผ ๋ค์ด "??odo"์ธ ๊ฒฝ์ฐ, "odo??"๋ก ๋ฐ๊พผ๋ค.
- ์ ๋์ฌ ๋ถ๋ถ๊น์ง ํธ๋ผ์ด๋ฅผ ๋ฐ๋ผ๊ฐ ํ ํด๋น ๋ ธ๋์ count๋ฅผ ๋ฐํํ๋ค.
- "?"๊ฐ ๋ค์ ๋ถ๋ ๊ฒฝ์ฐ (์ ๋ฏธ์ฌ)
- ์ ๋ฐฉํฅ ํธ๋ผ์ด(tries) ์ฌ์ฉ
- ์ ๋์ฌ ๋ถ๋ถ๊น์ง ํธ๋ผ์ด๋ฅผ ๋ฐ๋ผ๊ฐ ํ ํด๋น ๋
ธ๋์ count๋ฅผ ๋ฐํํ๋ค.
- ์๋ฅผ ๋ค์ด "fro??"์ธ ๊ฒฝ์ฐ, '?' ์ ์ธ 'o'์ count๋ฅผ ๋ฐํํ๋ค.
- ์ ๋ถ "?"์ธ ๊ฒฝ์ฐ
728x90
'coding_test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11945. ๋จ๊ฑฐ์ด ๋ถ์ด๋นต (ํ์ด์ฌ) (0) | 2025.03.08 |
---|---|
[๋ฐฑ์ค] 2675. ๋ฌธ์์ด ๋ฐ๋ณต (ํ์ด์ฌ) (0) | 2025.03.07 |
[๋ฐฑ์ค] 11719. ๊ทธ๋๋ก ์ถ๋ ฅํ๊ธฐ (ํ์ด์ฌ) (0) | 2025.03.04 |
[๋ฐฑ์ค] 11657. ํ์๋จธ์ (ํ์ด์ฌ) (0) | 2025.02.27 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฌธ์์ด ๋ด p์ y์ ๊ฐ์ (ํ์ด์ฌ) (1) | 2025.02.26 |