오랑우탄의 반란
프로그래머스 | 옹알이(2) (파이썬) permutation, 정규표현식 fullmatch 본문
오늘도 오랑이는 문제를 풉니다.
옹알이(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
오랑우탄이 영어를 하고 오랑이가 코드마스터가 되는 그날까지~
'PYTHON > 프로그래머스' 카테고리의 다른 글
프로그래머스 | 체육복 (파이썬) 그리디, SET 차집합 (0) | 2024.08.12 |
---|---|
프로그래머스 | 숫자 짝꿍 (파이썬) SET 교집합 (0) | 2024.08.08 |
프로그래머스 | 로또의 최고 순위와 최저 순위 (파이썬) 리스트 사용 (0) | 2024.08.07 |
프로그래머스 | 기사단원의 무기 (파이썬) n의 약수 개수 구하기 (0) | 2024.08.06 |
프로그래머스 | 덧칠하기 (파이썬) (2) | 2024.08.06 |