프로그래머스
[프로그래머스]불량 사용자
진철
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
반응형