프로그래머스 / 불량 사용자 / python

맹민재·2023년 5월 5일
0

알고리즘

목록 보기
87/134
def solution(user_id, banned_id):
    def check(u, b):
        if len(u) != len(b):
            return False
        
        for i in range(len(u)):
            if b[i] == '*':
                continue
            if u[i] != b[i]:
                return False
        
        return True
    
    def dfs(idx):
        if idx == len(banned_id):
            tmp_list = []
            for i in range(len(visited)):
                if visited[i] == True:
                    tmp_list.append(user_id[i])

            answer.add(tuple(tmp_list))
            return
        
        for i in range(len(user_id)):
            if not visited[i] and check(user_id[i], banned_id[idx]):
                visited[i] = True
                dfs(idx+1)
                visited[i] = False
    
    answer = set()
    visited = [False] * len(user_id)
    
    dfs(0)
    
    return len(answer)

dfs를 통해 해결한 문제

몇가지 경우의 수가 있는지를 물어보는 문제이므로 모든 경우를 찾아야 한다. 모든 경우를 탐색할 때는 dfs 알고리즘을 선호해서 dfs를 통해 문제를 해결했다.

탐색하면서 uesr_id와 banned_id가 일치하는지 확인하고 일치한 갯수가 banned_id의 lengh와 같다면 즉 banned_id와 일치한 user_id를 모두 찾았다면 set에 찾은 user_id를 저장한다. set을 사용한 이유는 모든 경우를 찾기 때문에 중복한 경우가 있을 수 있기 때문이다. (문제 조건이 순서는 다르고 이름이 같다면 같은 경우라고 주어졌다.)

마지막으로 set의 길이를 return 해줌으로서 정답을 구할 수 있다.


다른 많은 분들은 정규식을 사용해서 해결하셨던데... 정규식 까지 공부......

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글