https://school.programmers.co.kr/learn/courses/30/lessons/64064
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
첫 풀이
1. 정규표현식을 사용하기위해 *을 .로 바꿔준다. 정규표현식에서 . 은 아무 문자 상관없이 탐지한다는 뜻이다
2. banned_id에서 단어별로 user_id에서 패턴이 일치하는 단어를 삽입한다
입출력 예1
[('fradi', 'frodo'), ('abc123',)] |
3. 위의 리스트에서 단어를 하나씩 고른다. 중복되면 안됨
import re
def solution(user_id, banned_id):
answer = 1
ans=[]
for i in range(len(banned_id)):
banned_id[i]=banned_id[i].replace('*','.')
for pattern in banned_id:
tmp=[]
for s in user_id:
if re.match(pattern,s) and len(pattern)==len(s):
tmp.append(s)
ans.append(tuple(sorted(tmp)))
x = [] # 처음 등장한 값인지 판별하는 리스트
new_a = [] # 중복된 원소만 넣는 리스트
for i in ans:
if i not in x: # 처음 등장한 원소
x.append(i)
else:
if i not in new_a: # 이미 중복 원소로 판정된 경우는 제외
new_a.append(i)
for i in new_a:
for j in x:
if j==i:
x.remove(j)
for i in x:
answer*=len(i)
tmp=[]
for i in x:
for j in i:
if j not in tmp:
tmp.append(j)
return answer
단어를 하나씩 고르면서 중복을 피하는 단계에서 구현을 실패했다
더 나은 답안
1. 정규표현식을 위해 * -> . 로 변경한다
2. 순열을 사용하여 user_id에서 banned_id 개수만큼 뽑아준다. 모든 경우의 수가 나오게 된다
3. banned_id에서 정규표현식 패턴이 일치하는 경우만 리스트에 삽입한다
import re
from itertools import permutations
def solution(user_id, banned_id):
answer = []
n=len(banned_id)
for i in range(len(banned_id)):
banned_id[i]=banned_id[i].replace('*','.')
for i in permutations(user_id,n):
tmp=list(i)
flag=True
for j in range(n):
if re.match(banned_id[j], tmp[j]) and (len(banned_id[j]) == len(tmp[j])) :
continue
else:
flag = False
break
if flag:
if sorted(tmp) not in answer:
answer.append(sorted(tmp))
return len(answer)
배운 점
1. 정규표현식으로 패턴을 설정하면 원하는 형태의 문자열을 찾을 수 있다
2. 순열과 조합 개념과 코드를 정리를 해서 블로그에 정리해야겠다
2023.05.14 - [BackEnd/파이썬] - [파이썬] permutation, combination 순열과 조합
[파이썬] permutation, combination 순열과 조합
순열(순서의 나열) - 서로 다른 n 개 중 r 개를 골라 순서를 정해 나열하는 가짓수 - 순서상관 o -> (A, B)와 (B, A)는 다른 것 - Permutation import itertools arr = ['A', 'B', 'C'] per = itertools.permutations(arr, 2) print(li
whdgus928.tistory.com
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 파이썬 문제풀이 - 행렬의 곱셈 (0) | 2023.05.16 |
---|---|
[프로그래머스] 파이썬 문제풀이 - [카카오 인턴] 보석 쇼핑 (1) | 2023.05.14 |
[프로그래머스] SQL 문제풀이 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2023.05.14 |
[프로그래머스] MYSQL 문제풀이 - 입양 시각 구하기(1) (0) | 2023.05.13 |
[프로그래머스] 파이썬 문제풀이 - 점프와 순간 이동 (0) | 2023.05.13 |
댓글