프로그래머스

[프로그래머스]불량 사용자

진철 2023. 1. 17. 22:27
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/64064

 

프로그래머스

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

programmers.co.kr

문제를 간단하게 요약하면 다음과 같다.

이용자의 ID를 담고 있는 users_id 배열과 제재 ID를 담고 있는 banned_id 배열이 주어진다.

banned_id 배열은 ID 중간중간에 '*'가 섞여있어서 어떤 ID인지 정확하게 알 수 없다.

이때, users_id로 만들 수 있는 banned_id의 경우의 수는 몇 개인지 반환해야 한다.

 

코드를 작성하기 위한 순서는 다음과 같다.

1. 모든 users_id로 만들 수 있는 모든 경우의 수를 만들기 위해 permutations를 사용해준다.

2. users_id와 banned_id를 비교하여 같은지 아닌지 판단한다.(단, '*'는 모두 같다고 판단한다.)

from itertools import permutations #1번 : permutations을 사용하기 위한 import문

def check(user, ban): #2번 : users_id와 banned_id가 같은지 판단하는 함수
    if len(user)!=len(ban):
        return False
    for i,j in zip(user, ban):
        if j=='*': #2번 : '*'면 같다고 판단하고 계속 진행해준다.
            continue
        if j!=i:
            return False
    return True

def solution(user_id, banned_id):
    answer = 0
    stack=[]
    
    for i in permutations(user_id,len(banned_id)): #1번 banned_id 배열의 크기만큼 users_id의 모든 경우의 수를 구해준다.
        cnt=0
        for a, b in zip(i,banned_id):
            if check(a, b): #경우의 수 하나와 banned_id가 같으면 cnt++를 해준다.
                cnt+=1
            if cnt==len(banned_id): #cnt가 banned_id의 배열의 크기와 같으면 모두 동일한 것이므로
                if set(i) not in stack: #stack에 중복되지 않으면 append 해준다.
                    stack.append(set(i))
    answer=len(stack) #경우의 수를 구하는 문제이기 때문에, len(stack)이 정답이다.
    return answer

 

728x90
반응형