🔗 Problem Link
❔Thinking
- 일부 문자가 가려진 banned_id와 일치하는 user_id 목록을 만들고, 목록의 개수를 반환한다.
- 목록의 순서는 관계없으며, 목록의 아이디가 일치한다면 하나의 목록으로 간주한다.
💻Solution
1. id별 일치 여부를 확인하는 풀이
from itertools import permutations
def IdCheck(uid, bid):
if len(uid) != len(bid):
return False
correct_cnt = 0
for i in range(len(bid)):
if bid[i] == uid[i] or bid[i] == '*':
correct_cnt += 1
return True if correct_cnt == len(bid) else False
def solution(user_id, banned_id):
answer = set()
for id_list in permutations(user_id, len(banned_id)):
for uid, bid in zip(id_list, banned_id):
flag = 1
if IdCheck(uid, bid) is False:
flag = 0
break
if flag == 1:
id_list = tuple(sorted(id_list))
answer.add(id_list)
return len(answer)
2. re.fullmatch를 활용한 풀이
import re
from itertools import permutations
def solution(user_id, banned_id):
ban = ' '.join(banned_id).replace('*','.')
answer = set()
for id_list in permutations(user_id, len(banned_id)):
if re.fullmatch(ban, ' '.join(id_list)):
answer.add(''.join(sorted(id_list)))
return len(answer)
🗝️keypoint
- '.'는 모든 문자와 일치하는 문자이다.
- re.match는 패턴을 검사하고, re.fullmatch는 문자열 전체의 동일 여부를 검사한다.
- permutations는 서로 다른 n 개 중 r 개를 골라 순서를 정해 나열하는 방법을 각각 '튜플'로 반환한다.
'코딩테스트 > Python' 카테고리의 다른 글
[Programmers] Level 2. 메뉴 리뉴얼 (0) | 2022.11.15 |
---|---|
[Programmers] Level 3. 보석 쇼핑 (0) | 2022.11.13 |
[Baekjoon] 1463 - 1로 만들기 (0) | 2022.11.01 |
[Baekjoon] 1003 - 피보나치 함수 (0) | 2022.10.30 |
[Baekjoon] 17219. 비밀번호 찾기 (0) | 2022.10.30 |