Coding Test/프로그래머스(Python)

[프로그래머스/Python] Level 3_불량 사용자

syunze 2024. 2. 10. 16:09

📌문제 유형

구현

 

📌문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌나의 문제풀이

- product( 데카르트 곱 ) : 두 개 이상의 리스트의 모든 조합을 구할 때 사용

  • product(A, B) ((x,y) for x in A for y in B)로 사용

- 2차원 리스트 중복 제거

 

[Python] 2차원 list 중복 제거

파이썬 리스트의 중복을 제거하고 싶을때 1차원 리스트는 set()를 사용하면 편리하게 제거할 수 있습니다.items = [1, 2, 2, 3, 3, 3] print(set(items)) # {1, 2, 3} 이를 활용하여 2차원 리스트도 다음과 같은

inma.tistory.com

from itertools import product

def solution(user_id, banned_id):
    answer = 0
    ban_same = [[] for _ in range(len(banned_id))]
    final = []
    
    for i in range(len(banned_id)):
        for j in range(len(user_id)):
            # banned_id[i]와 길이 같은 것만 비교
            if len(banned_id[i]) == len(user_id[j]):
                # 각각의 문자 비교, *이 아닌 문자가 서로 다른 경우 포함하지 않음
                flag = 0
                for k in range(len(user_id[j])):
                    if banned_id[i][k] != '*' and user_id[j][k] != banned_id[i][k]:
                        flag = 1
                        break
                if flag == 0:
                    ban_same[i].append(user_id[j])
                    
    # 2차원 리스트 모든 조합
    product_list = list(product(*ban_same))
    
    # item과 banned_id의 길이가 같고 리스트 내 중복이 없는 것
    final = list(set([tuple(set(item)) for item in product_list if len(set(item)) == len(banned_id)]))
    
    return len(final)

 

 

📌다른사람의 문제풀이

- product 사용

  • result for문 구문을 풀어서 작성
from itertools import product

def check(str1, str2):
    if len(str1) != len(str2):
        return False
    for i in range(len(str1)):
        if str1[i] == "*":
            continue
        if str1[i] != str2[i]:
            return False
    return True

def solution(user_id, banned_id):
    answer = set()
    result = [[] for i in range(len(banned_id))]

    for i in range(len(banned_id)):
        for u in user_id:
            if check(banned_id[i], u):
                result[i].append(u)

    result = list(product(*result))
    for r in result:
        if len(set(r)) == len(banned_id):
            answer.add("".join(sorted(set(r))))

    return len(answer)

 

- DFS 사용

def combi(temp, number, calculate):
    global result
    if len(temp) == len(calculate):
        temp = set(temp)
        if temp not in result:
            result.append(temp)
        return
    else:
        for j in range(len(calculate[number])):
            if calculate[number][j] not in temp:
                temp.append(calculate[number][j])
                combi(temp, number+1, calculate)
                temp.pop()
result = []
def solution(user_id, banned_id):
    global result
    calculate = []
    for ban in banned_id:
        possible=[]
        for user in user_id:
            if len(ban) != len(user):
                continue
            else:
                count = 0
                for i in range(len(ban)):
                    if user[i] == ban[i]:
                        count+=1
                if count == len(ban)-ban.count('*'):
                    possible.append(user)
        calculate.append(possible)

    combi([], 0, calculate)
    return len(result)

 

📌리뷰

- product : 모든 조합을 구할 수 있음

  • *_list : unpacking 역할. 
 

velog

 

velog.io

 

파이썬 asterisk(*) 사용 용도

이 글은 파이썬에서 * 표현이 어떤 용도로 사용하는지에 대해 다룹니다. 1. 곱셈과 거듭제곱 - 굳이 코드를 붙이지 않아도 다들 아실거라고 생각합니다. 1 * 2 = 2 2 ** 2 = 4 2. 리스트 확장 * 를 사용

hwiyong.tistory.com

from itertools import product

_list = ["012", "abc", "!@#"]
pd = list(product(*_list))
# [('0', 'a', '!'), ('0', 'a', '@'), ('0', 'b', '!'), ('0', 'b', '@'), ('1', 'a', '!'), ('1', 'a', '@'), ('1', 'b', '!'), ('1', 'b', '@')]

 

- product, set, 길이 동일로 푸는데 오래걸림 

728x90