오랑우탄의 반란

프로그래머스 | 옹알이(2) (파이썬) permutation, 정규표현식 fullmatch 본문

PYTHON/프로그래머스

프로그래머스 | 옹알이(2) (파이썬) permutation, 정규표현식 fullmatch

5&2 2024. 8. 7. 17:45
반응형

 

오늘도 오랑이는 문제를 풉니다.

 

옹알이(2) 

 

풀이 과정 1

  • "aya", "ye", "woo", "ma" 4개의 요소 순열 구하기
  • babbling 이 순열과 일치하면 개수 세기 

Permutation vs Combination

앞서 배웠던 itertools 의 combination 조합과 비슷하지만 조금 다른 permutation 순열을 사용해봤습니다. 

 

Permutation (nPr)

  • 순서를 고려한 숫자들의 매칭 
  • 예) (1, 2), (1, 3), (2, 3), (3, 2), (3, 1), (2, 1) 

Combination (nCr)

  • 순서를 고려하지 않는, 숫자들의 중복 없는 매칭
  • 예) (1, 2), (1, 3), (2, 3) 

 

speak 발음의 모든 순열을 구해야 하기 때문에 for 반복문에 1~5개씩 순열 조합을 만들어내게 넣어줍니다. 

append 보다는 extend를 사용해야 각각 원소로 들어가 flat 리스트로 만들어줍니다. 

 

만들어진 perm 리스트에 대해 모든 원소를 연결해준 base 를 만들고

babbling 의 각 원소가 base 에 있는지 확인해줍니다. 

import itertools

def solution(babbling):
    answer = 0
    speak = ["aya", "ye", "woo", "ma"]
    perm = []
    base = []
    
    for i in range(1,5):
        perm.extend(itertools.permutations(speak,i))
    for j in perm:
        base.append("".join(j))
    for k in babbling:
        if k in base:
            answer += 1
    
    return answer

 

하지만 이 풀이는 정확성이 75%밖에 되지 않아서 테스트 통과를 하지 못했습니다. 

통과를 못한 문제도 있지만 효율성과 메모리 사용 측면에서도 그리 좋은 코드는 아닙니다. 

 


 

풀이 과정 2

위 풀이보다는 정규 표현식을 지원하는 re 모듈을 활용해 다시 풀어봅니다. 

 

정규식 관련 기초적인 내용은 [Python] 정규표현식, re모듈 사용 총정리 포스트를 참고해주세요.

정규식 관련 자세한 설명은 파이썬 공식 문서를 참고해주세요.

 

  • "aya", "ye", "woo", "ma" 중에 1개 이상 일치 체크 → | 로 구분, +
  • 같은 발음 연속 불가 → ?!
  • babbling 의 각 string 전체가 정규식과 일치하는지 체크 → fullmatch

 

우선 정규식을 작성해봅니다.

import re
p = re.compile(r'(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+')

check = p.fullmatch(문자열)

 


정규식 표현 ? 활용 

표현 의미 활용
a(?=b) a 뒤에 b가 오는 경우에만 매칭 re.fullmatch(hello(?=world),'helloworld')
helloworld
a(?!b) a 뒤에 b가 오지 않는 경우에만 매칭 re.fullmatch(hello(?!world),'helloworld')
None

 

babbling 의 각 원소에 대해, 앞서 작성한 정규식과 완전히 일치하는지 확인해줍니다. 

조카의 발음 조합 외에 다른 문자가 오면 기각시켜야 하기 때문에 search (다른 문자 있을 경우에도 매치) 대신 fullmatch 를 사용해 순열 조합만 일치하게끔 설계해줍니다. 

answer = 0
for i in babbling:
    if p.fullmatch(i):
        answer +=1

 

 

최종 코드

def solution(babbling):
    import re
    p = re.compile(r'(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+')
    
    answer = 0
    for i in babbling:
        if p.fullmatch(i):
            answer +=1
    
    return answer

 

좀 더 축약해서 표현하면 아래와 같습니다. 

def solution(babbling):
    import re
    answer = 0
    
    for i in babbling:
        if re.fullmatch(r'(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+', i):
            answer +=1
    
    return answer

 

 


 

오랑우탄이 영어를 하고 오랑이가 코드마스터가 되는 그날까지~

 

 

반응형