본문 바로가기

IT/코딩테스트

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

반응형

https://programmers.co.kr/learn/courses/30/lessons/64064

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

 

🤷‍♂️ 풀이

user_id = ["frodo", "fradi", "crodo", "abc123", "frodoc"]


banned_id = ["fr*d*", "abc1**"]

우선 user_id에서 banned_id의 길이만큼 permutations을 해준다

 

제한사항에서 배열의 크기를 1 이상 8 이하로 설정했기 때문에 시간 초과가 발생하지 않을 것이다

[('frodo', 'fradi'), ('frodo', 'crodo'), ('frodo', 'abc123'), ('frodo', 'frodoc'), ('fradi', 'frodo'),

('fradi', 'crodo'), ('fradi', 'abc123'), ('fradi', 'frodoc'), ('crodo', 'frodo'), ('crodo', 'fradi'),

('crodo', 'abc123'), ('crodo', 'frodoc'), ('abc123', 'frodo'), ('abc123', 'fradi'), ('abc123', 'crodo'),

('abc123', 'frodoc'), ('frodoc', 'frodo'), ('frodoc', 'fradi'), ('frodoc', 'crodo'), ('frodoc', 'abc123')]

그럼 다음과 같은 결과를 얻을 수 있다

 

우린 여기서 banned_id에 맞는 경우만 추출해 가져오면 된다

 

* combinations를 쓰지 않는 이유는 banned_id의 순서를 신경 쓰지 않고 진행시켜주기 위함이다

 

만약 combinations을 쓴다면 ('frodo', 'fradi')와 ('fradi', 'frodo')는 같은 취급을 받는다

 

그 때문에 결국 한 개만 선택되기 때문에 permutations을 써준다

 

결국에 우리는 permutations 한 결과를 하나씩 불러와 banned_id와 조건에 부합하는지 하나씩 검사해 주면 된다

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from itertools import permutations
 
def check(unit, ban):
    for i in range(len(unit)):
        if len(unit[i]) != len(ban[i]): #가져온 tuple과 banned_id의 길이가 맞지않는다면 종료
            return False
        for j in range(len(unit[i])): #tuple의 스펠과 baaned_id가 맞지않는다면 종료, "*"는 그대로 진행
            if unit[i][j] != ban[i][j] and ban[i][j] != "*":
                return False
 
    return True
        
def solution(user_id, banned_id):
    answer = []
    print(list(permutations(user_id, len(banned_id))))
    for unit in permutations(user_id, len(banned_id)): #permutations에서 tuple을 한개씩 가져온다
        if check(unit, banned_id):
            if set(unit) not in answer: #겹치는지 판별
                answer.append(set(unit))
    
    return len(answer) #중복값이 제거된 answer의 길이출력
cs

 

 

그리고 답을 낼때는 tuple안에 있는 이름이 겹치면 안되기 때문에

 

unit을 set으로 바꿔준다음 answer에 넣어준다

 

set에서는 자동으로 중복값을 제거해주기때문에 중복값을 제거할 수 있다

 

 

 

 

반응형