본문 바로가기
Algorithm/프로그래머스

[프로그래머스] 파이썬 문제풀이 - 불량 사용자

by whdgus928 2023. 5. 14.

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

 

반응형

댓글