불량 사용자

Sirius·2025년 3월 19일
0

문제

1) 매핑

  1. 문자열 길이 똑같은거
  2. 불량이 * 거나 같으면
    -> 불량사용자에 매핑됨

2) 조합

매핑될 수 있는 모든 경우의 수를 구하라

처음생각했던 방식

  • 딕셔너리 만들어서 조합 수학으로 계산하려고 함
  • 키가 중복되는 이슈 -> banned_id는 중복가능
  • 숫자만으로는 계산식 만들기 어려움

새로운방식

1) n=1~8 -> 엄청난힌트

-> 순열(permutations)
-> 모든 순열 만들어서 검사

2) 검사식

def check(user, banned):
    index=0
    flag=1
    if len(user)!=len(banned):
        flag=0
    else:
        while index < len(banned):
            if user[index]!=banned[index] and banned[index]!="*":
                flag=0
                break
            index+=1
    
    if flag==0:
        return False
    else:
        return True

index 증가시키면서 *도 아니고 같지 않으면 break 시킴

3) 중복처리

예를 들어 위의 경우 permutations 함수를 돌렸을때 (frodo, crodo, abc123, frodoc) 순열도 나올 수 있고 (frodo, crodo, frodoc, abc123) 순열도 나올 수 있다.
또한 이 2개 모두 검사식을 통과해서 둘다 count될 수 있음.
그러나 banned_id에 매핑되는 모든 조합을 계산하는 거라 이거는 중복임.

def solution(user_id, banned_id):
    answer = 1
    ps = list(permutations(user_id, len(banned_id)))
    value=[]
    for p in ps:
        temp=0
        i=0
        while i < len(banned_id):
            if check(p[i], banned_id[i]):
                temp+=1
            i+=1
        if temp==len(banned_id) and set(p) not in value:
            value.append(set(p))
    return len(value)

이때 순열의 중복이 있는지 검산할때는 set()으로 만들어서 중복을 검산한다.

  • 즉 여러 가지로 분열된 순열을 하나의 공통된 값으로 모은다.
    (frodo, fradi, crodo, abc123)
    (fradi, frodo, crodo, abc123)
    모두 (frodo, fradi, crodo, abc123)으로 고정됨

0개의 댓글