반응형
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에서는 자동으로 중복값을 제거해주기때문에 중복값을 제거할 수 있다
반응형
'IT > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 블록 이동하기 python [2020 KAKAO BLIND RECRUITMENT] (0) | 2023.02.02 |
---|---|
[프로그래머스] 동굴탐험 python (0) | 2021.12.08 |