
프로그래머스 코딩테스트 입문 마지막 문제입니다.
상세 설명 : https://school.programmers.co.kr/learn/courses/30/lessons/120956
우선, 문제 이해의 핵심은 발음할 수 있는 단어들간의 조합만 조카가 발음할 수 있다는 것이다. ex. ayaye -> O / mayaya -> X
최근에 NLP 졸업시험을 봤더니 문자열 처리라는 키워드를 떠올리니 제일 먼저 정규표현식이 생각나서, 우선 정규 표현식을 활용하여 문제를 풀어봤다.
import re
def solution(babbling):
regex = re.compile('^(aya|ye|woo|ma)+$')
answer = 0
for word in babbling:
if regex.match(word):
answer += 1
return answer
regex : ()
정규 표현식에서 ()는 추출한 패턴을 지정하는 역할을 한다. 조카가 발음 가능한 단어들끼리의 조합만을 발음할 수 있기 때문에 "aya" "ye", "woo","ma"만 추출해야 한다.
regex : |
정규 표현식에서 |는 or을 뜻한다. 위에서 언급한 발음 가능한 단어들 중 하나만 족해도 추출해야하므로 모든 단어들 사이를 |로 연결해 준 것이다.
regex : ^ , $
^는 문자열의 시작 또는 부정(not)을 의미하고 $는 문자열의 끝을 의미한다. 여기서는 문자열의 시작의 역할로 사용되었다. 발음가능한 단어를 제외한 다른 단어가 앞 뒤에 들어가면 안되고 ()안의 요소들끼리로만 구성되어야 하므로 ^ 와 $를 사용했다.
regex : match
문자열에서 정규표현식에 매칭되는 항목들을 배열로 반환한다. match가 될 때는 match의 객체를 돌려주고, match되지 않을 때는 None을 반환한다. 정규식 메소드 중 match를 선택한 이유는 match 메서드는 문자열의 처음부터 정규식과 match되지 않으면 None값을 내놓기 때문이다. 따라서 문자열 전체를 탐색하는 search보다 처음부터 검색하는 match를 선택했다. 사실 정규 표현식을 위와 같이 선언해주었기 때문에, search를 사용해도 테스트 결과가 틀리지는 않는다.
정규 표현식을 사용하지 않고 푸는 사례도 있길래 정규표현식을 사용하지 않고 문제를 풀어보았다.
def solution(babbling):
answer = 0
ableWord = ['aya', 'ye', 'woo', 'ma']
for saidWord in babbling:
for word in ableWord:
if word in saidWord:
saidWord = saidWord.replace(word, ' ')
if len(saidWord.strip()) == 0:
answer += 1
return answer
1. ableWord 정의
조카가 발음할 수 있는 단어들을 담은 리스트를 정의하여, 발음할 수 있는 단어의 변화가 있을 때도 재활용 할 수 있도록 하였다.
2. 바깥 for문
입력 받은 babbling을 순차적으로 돌면서 전체 babbling에 대한 처리를 해줄 수 있도록 for문을 정의하였다.
3. 내부 for문 & 내부 if문
babbling의 하나의 문자열(saidWord) 내부에 발음할 수 있는 단어(word)가 포함되어있는 경우 발음할 수 있는 단어(word)를 space(공백)로 바꾸어주도록 하였다.
ex. 'ayaee'인 경우 'aya'를 발음할 수 있기 때문에 해당 문자열은 ' ee'가 됨
4. 외부 if문
모든 과정을 마친 후, saidWord의 양쪽 공백을 없앤 문자열의 길이가 0인 경우는 해당 단어 내의 모든 발음이 가능하여 모두 공백으로 바뀐 뒤 공백을 제거하여 0이 되었다는 뜻이므로 최종적으로 조카가 발음할 수 있다. 따라서 answer에 1을 더하여 준다.