📖 문제
https://programmers.co.kr/learn/courses/30/lessons/64064
💻 코드
처음 작성한 코드
from itertools import product
def search(k, _list):
sl = list()
for s in _list:
if len(s) != len(k):
continue
isCorrect = True
for i in range(len(s)):
if not (s[i] == k[i] or k[i] == '*'):
isCorrect = False
break
if isCorrect:
sl.append(s)
return sl
def solution(user_id, banned_id):
sll = list()
answer = set()
for _id in banned_id:
sll.append(search(_id, user_id))
for candi in product(*sll):
if len(set(candi)) == len(banned_id):
answer.add(''.join(sorted(candi)))
return len(answer)
리팩터링한 코드
from itertools import product
def check(s, _id):
if len(s) != len(_id):
return False
for i in range(len(s)):
if not (s[i] == _id[i] or _id[i] == '*'):
return False
return True
def search(_id, _list):
sl = list()
for s in _list:
if check(s, _id):
sl.append(s)
return sl
def solution(user_id, banned_id):
sll = [search(_id, user_id) for _id in banned_id]
ans = set()
for candi in product(*sll):
if len(set(candi)) == len(banned_id):
ans.add(''.join(sorted(candi)))
return len(ans)
🙌 한마디
두 가지 구현
두 코드는 동일하게 작동하지만, 검색 문자열을 비교할 때 구현 방식에 차이가 있다.
처음 작성한 코드는 이중 for문을 연속해서 break 하기 위해서 isCorrect라는 변수를 도입했다.
리팩터링한 코드는 for문을 한번만 사용하고 check라는 메서드를 따로 정의해서 문자열을 비교하여 bool 자료형을 반환했다.
itertools 라이브러리의 product 메서드
새롭게 알게된 메서드.
Cartesian Product를 표현할 때 사용하는 메서드이다
두 개 이상의 리스트의 모든 조합을 구할 때 사용된다.
*args
어떤 파라미터를 몇 개 받을지 모르는 경우 사용한다.
위 코드에서 sll의 원소 개수를 컴파일 시점에서 알 수 없어 사용했다.
'Problem Solving > 📕Programmers' 카테고리의 다른 글
[Programmers] 다트 게임 (Python) (0) | 2021.10.13 |
---|---|
[Programmers] 징검다리 건너기 (Python) (0) | 2021.10.12 |
[Programmers] 비밀지도 (Python) (0) | 2021.10.10 |
[Programmers] 크레인 인형뽑기 게임 (Python) (0) | 2021.10.10 |
[Programmers] 튜플 (Python) (0) | 2021.10.09 |