📖  문제

https://programmers.co.kr/learn/courses/30/lessons/64064

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

 

💻  코드

처음 작성한 코드

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의 원소 개수를 컴파일 시점에서 알 수 없어 사용했다.

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기