Coding Test/프로그래머스(Python)
[프로그래머스/Python] Level 3_불량 사용자
syunze
2024. 2. 10. 16:09
📌문제 유형
구현
📌문제
📌나의 문제풀이
- product( 데카르트 곱 ) : 두 개 이상의 리스트의 모든 조합을 구할 때 사용
- product(A, B)는 ((x,y) for x in A for y in B)로 사용
- 2차원 리스트 중복 제거
from itertools import product
def solution(user_id, banned_id):
answer = 0
ban_same = [[] for _ in range(len(banned_id))]
final = []
for i in range(len(banned_id)):
for j in range(len(user_id)):
# banned_id[i]와 길이 같은 것만 비교
if len(banned_id[i]) == len(user_id[j]):
# 각각의 문자 비교, *이 아닌 문자가 서로 다른 경우 포함하지 않음
flag = 0
for k in range(len(user_id[j])):
if banned_id[i][k] != '*' and user_id[j][k] != banned_id[i][k]:
flag = 1
break
if flag == 0:
ban_same[i].append(user_id[j])
# 2차원 리스트 모든 조합
product_list = list(product(*ban_same))
# item과 banned_id의 길이가 같고 리스트 내 중복이 없는 것
final = list(set([tuple(set(item)) for item in product_list if len(set(item)) == len(banned_id)]))
return len(final)
📌다른사람의 문제풀이
- product 사용
- result for문 구문을 풀어서 작성
from itertools import product
def check(str1, str2):
if len(str1) != len(str2):
return False
for i in range(len(str1)):
if str1[i] == "*":
continue
if str1[i] != str2[i]:
return False
return True
def solution(user_id, banned_id):
answer = set()
result = [[] for i in range(len(banned_id))]
for i in range(len(banned_id)):
for u in user_id:
if check(banned_id[i], u):
result[i].append(u)
result = list(product(*result))
for r in result:
if len(set(r)) == len(banned_id):
answer.add("".join(sorted(set(r))))
return len(answer)
- DFS 사용
def combi(temp, number, calculate):
global result
if len(temp) == len(calculate):
temp = set(temp)
if temp not in result:
result.append(temp)
return
else:
for j in range(len(calculate[number])):
if calculate[number][j] not in temp:
temp.append(calculate[number][j])
combi(temp, number+1, calculate)
temp.pop()
result = []
def solution(user_id, banned_id):
global result
calculate = []
for ban in banned_id:
possible=[]
for user in user_id:
if len(ban) != len(user):
continue
else:
count = 0
for i in range(len(ban)):
if user[i] == ban[i]:
count+=1
if count == len(ban)-ban.count('*'):
possible.append(user)
calculate.append(possible)
combi([], 0, calculate)
return len(result)
📌리뷰
- product : 모든 조합을 구할 수 있음
- *_list : unpacking 역할.
from itertools import product
_list = ["012", "abc", "!@#"]
pd = list(product(*_list))
# [('0', 'a', '!'), ('0', 'a', '@'), ('0', 'b', '!'), ('0', 'b', '@'), ('1', 'a', '!'), ('1', 'a', '@'), ('1', 'b', '!'), ('1', 'b', '@')]
- product, set, 길이 동일로 푸는데 오래걸림
728x90