티스토리 뷰
프로그래머스 '불량 사용자' 문제 풀이입니다.
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/64064
● 문제 간단 설명
응모자 아이디 배열과 불량 사용자 아이디 목록을 전달받아, 불량 사용자로 매핑되어 제외되어야 하는 아이디 목록을 뽑아내는 문제입니다.
예를 들어, 이벤트에 응모한 전체 사용자 아이디 목록이 다음과 같다면
응모자 아이디
frodo |
fradi |
crodo |
abc123 |
frodoc |
다음과 같이 불량 사용자 아이디 목록이 전달된 경우,
불량 사용자
fr*d* |
abc1** |
불량 사용자에 매핑되어 당첨에서 제외되어야 야 할 제재 아이디 목록은 다음과 같이 두 가지 경우가 있을 수 있습니다.
제재 아이디
frodo |
abc123 |
제재 아이디
abc123 |
fradi |
이벤트 응모자 아이디 목록이 담긴 배열 user_id와 불량 사용자 아이디 목록이 담긴 배열 banned_id가 매개변수로 주어질 때, 당첨에서 제외되어야 할 제재 아이디 목록은 몇 가지 경우의 수가 가능한 지 return 하도록 solution 함수를 완성하는 문제입니다.
● 문제 해결 방향
● 문제 해결 코드
from collections import Counter
from itertools import permutations
def matchWord (user_id, banned_id): # 밴 아이디와 사용자 아이디가 매치되는지 확인
for index in range(len(user_id)):
if (banned_id[index] != '*') and (user_id[index] != banned_id[index]):
return False
return True
def match(user_group, banned_id): # 밴 아이디배열과 사용자 아이디배열이 일치하는지 확인
for index in range(len(user_group)):
if len(user_group[index]) != len(banned_id[index]) : return False
else :
if not matchWord(user_group[index], banned_id[index]): return False
return True
def solution(user_id, banned_id):
answer = 0
user_groups = list(permutations(user_id, len(banned_id))) # 밴 아이디 배열고 길이기 같은 사용자 아이디의 모든 조합을 출력
match_group = []
for user_group in user_groups: # 각 사용자 아이디 배열과 밴 아이디 배열을 비교
if match(user_group, banned_id) and (len(user_group) == len(set(user_group))):
if set(user_group) not in match_group : match_group.append(set(user_group)) # 일치하는 배열들 내 중복된 아이디가 있는지 확인
return len(match_group)
matchWord() : 밴 아이디와 사용자 아이디의 길이와 각 철자가 일치하는지 확인하는 함수.
match() : 밴 아이디 배열과 사용자 아이디 배열의 요소가 1 대 1로 비교했을 때 일치하는지 확인하는 함수.
Solution() :
user_id로 만들 수 있는 밴 아이디와 같은 길이의 배열을 permutations를 활용하여 모두 만들어 낸 뒤,
위에서 만들어 놓은 matchWord(), match() 함수를 활용하여
밴 아이디 배열과 사용자 아이디 조합 배열이 일치하는지 확인했습니다.
일치하더라도 같은 사용자가 다른 밴 아이디 형식으로 두 번 검색될 수 있기 때문에
중복을 제거하기 위해 set함수를 활용하여 중복을 제거하였습니다.
처음에는 밴 아이디 유형에 따라 검색될 수 있는 아이디를 딕셔너리 형식으로 저장한 후에
그 아이디들을 조합하는 방식을 사용했습니다.
결과는 테스트 케이스에는 모두 정답이라고 나왔지만, 채점 시에 몇 가지 실패로 나오는 부분이 있어
전체 사용자 아이디 조합을 구한 후 조건을 만족하는 조합을 찾아내는 방식으로 순서를 바꾸었습니다.
● 알게 된 것
itertools 라이브러리의 permutations 함수를 사용했는데
다른 문제를 풀 때도 자주 사용했던 함수라 손에 익혀야겠다는 생각을 했습니다.
이상 프로그래머스 '불량 사용자' 문제 풀이였습니다.
더 좋은 풀이나 설명이 잘못된 부분이 있으면 알려주세요!
감사합니다.
'PYTHON' 카테고리의 다른 글
[프로그래머스/PYTHON] 표 편집 (0) | 2021.09.05 |
---|---|
[프로그래머스/PYTHON] 디스크 컨트롤러 (0) | 2021.09.04 |
[프로그래머스/PYTHON] 모음 사전 (0) | 2021.09.02 |
[프로그래머스/PYTHON] 상호 평가 (0) | 2021.09.02 |
[프로그래머스/PYTHON] 직업군 추천하기 (0) | 2021.09.02 |
- Total
- Today
- Yesterday
- Vuex
- GraphQL
- 문제풀이
- Vue
- redux
- React.memo
- Vue.js
- error
- Preloading
- reactrouter
- Transpiler
- 프로그래머스
- SOAP API
- Repository Pattern
- js
- React
- 백준
- 파이썬
- webpack
- SPA
- v-for
- python
- 알고리즘
- redux-thunk
- AxiosInterceptor
- clean code
- TypeScript
- 상호평가
- programmers
- bundler
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |