๋ฌธ์ ๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/64064
๋ฌธ์ ์ค๋ช
permutation์ ์ด์ฉํด user_id์ ๋ชจ๋ ๊ฐ๋ฅํ ์์ด์ ๊ตฌํ ๋ค re(์ ๊ทํํ์)์ ์ด์ฉํด ์ ์ฌ ์์ด๋์ ์ผ์นํ๋์ง๋ฅผ ํ์ธํ์ต๋๋ค.
1. ์์ด ๋ง๋ค๊ธฐ
- banned_id์ ๊ฐ์๋งํผ user_id์ ์์๋ฅผ ๋ฝ์์ ๋ง๋ค ์ ์๋ ์์ด์ ์์ฑํฉ๋๋ค.
2. ํด๋น ์์ด๋ก ์ ์ฌ ์์ด๋ ๋ชฉ๋ก์ ๋ง๋ค ์ ์๋์ง ํ์ธ
- ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๋ค๋ฅด๊ฑฐ๋ (len(banned_id[i] != len(p[i])
- ์ ๊ทํํ์์ ๋ง์ง ์๋ ๊ฒฝ์ฐ (re.match(banned_id[i].replace('*', '.'), p[i]))
- ์์ด์ i๋ฒ์งธ ์์๊ฐ banned_id์ i๋ฒ์งธ ์์์ ๋งค์น๋์ง ์์ต๋๋ค.
- ์์ด์ n๊ฐ์ ์์๋ก ์ ์ฌ ๋ชฉ๋ก์ n๊ฐ์ id๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด answer์ ํด๋น ์์ด์ ์งํฉ์ผ๋ก ๋ฐ๊ฟ์ ์ถ๊ฐํฉ๋๋ค.
- ์ฐธ๊ณ ) ์ ๊ทํํ์์์ re.match๋ ๋ฌธ์์ด์ ์ฒ์๋ถํฐ ์ ๊ท์๊ณผ ๋งค์น๋๋์ง ์กฐ์ฌํ์ฌ, ์ ๊ท์์ ๋ถํฉํ๋ฉด match ๊ฐ์ฒด๋ฅผ ๊ทธ๋ ์ง ์์ผ๋ฉด None์ return ํฉ๋๋ค.
- ์ฐธ๊ณ ) ์ ๊ท ํํ์์ Dot(.) ๋ฉํ ๋ฌธ์๋ ์ค ๋ฐ๊ฟ ๋ฌธ์์ธ \n์ ์ ์ธํ ๋ชจ๋ ๋ฌธ์์ ๋งค์น๋จ์ ์๋ฏธํฉ๋๋ค.
3. ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ
- ๊ฐ๋ฅํ user_id์ ์กฐํฉ(์งํฉ ์๋ฃํ์ผ๋ก ์ ์ฅํ์ผ๋ฏ๋ก ์์ด์ด ์๋ ์กฐํฉ์ด ๋จ)์ด answer์ ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก answer์ ๊ธธ์ด๋ฅผ return ํฉ๋๋ค.
- answer ๋ํ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ ์งํฉ ๋ด์ ์งํฉ์ ์ ์ฅํ๊ธฐ ์ํด์ frozenset์ ์ด์ฉํ์ต๋๋ค.
์์ค์ฝ๋
from itertools import permutations
import re
def solution(user_id, banned_id):
answer = set()
n = len(banned_id) # ์ ์ฌ ์์ด๋ ๊ฐ์
perm = list(permutations(user_id, n)) # user_id์ n๊ฐ ์์๋ก ์์ด ์์ฑ
for p in perm:
cnt = 0
# ์์ด๋๊ฐ ์ผ์นํ๋์ง ํ์ธ
for i in range(n):
if not re.match(banned_id[i].replace('*', '.'), p[i]) or len(banned_id[i]) != len(p[i]):
break
else:
cnt += 1
# p๋ก ์ ์ฌ ์์ด๋ ๋ชฉ๋ก์ ๋ง๋ค ์ ์์
if cnt == n:
answer.add(frozenset(p))
return len(answer)
์ฐธ๊ณ ์๋ฃ
์ ํ ํฌ ํ์ด์ฌ - ์ ๊ทํํ์