IT Studying

옹알이(1) 본문

코딩테스트/프로그래머스

옹알이(1)

IT wiz 2023. 2. 20. 22:22
반응형

프로그래머스 입문 마지막 문제인 옹알이 (1)입니다.

 

 문제: 아기가 할 수 있는 말은 "aya", "ye", "woo", "ma" 네가지 단어입니다. 아기는 이 단어들을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 리스트 babbling이 매개변수로 주어질 때, 아기가 발음할 수 있는 단어의 개수를 return하도록 solution함수 완성해주세요.

 

입출력의 예 #1["aya", "yee", "u", "maa", "wyeoo"] -> result : 1

 

 이 글을 보러 오신 분들은 보통 프로그래머스에서 문제 푸신 분들일 것이기 때문에 문제 설명은 간단히 하겠습니다. 문제를 더 자세히 보고 싶으신 분은 https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc&page=5 들어가셔서 문제를 푸시면 되겠습니다!

 

 처음에 문제를 봤을 때 입문에서 첫 번째 문제부터 풀고 있다가 어찌저찌해서 다른 문제들을 건너뛰고 우연히 이 문제를 풀게 되었는데, 갑자기 난이도가 세져서 당황했었습니다;;(알고보니 입문의 마지막 문제더군요) 이 문제에서 포인트는 입력받은 값을 아기가 발음할 수 있는 단어를 사용하여 어떻게 처리하느냐라고 생각하였습니다. 예를 들어 입력받은 값이 'ayaye'라면 아기는 'aya', 'ye'를 발음할 수 있으니 발음할 수 있는 단어입니다. 여기서 aya와 ye를 빼주면 입력받은 값은 ""가 될 것입니다. 이러한 방식으로 알고리즘을 짜면 아기가 발음할 수 있는 단어는 모두 ""가 되게 됩니다. 그렇다면 ""가 되는 갯수가 아기가 발음할 수 있는 단어의 갯수이겠죠!

def solution(babbling):
    cnt = 0
    words = ['aya', 'ye', 'woo','ma']
    for i in babbling:
        for j in words:
            i = i.replace(j, " ")
            if not i.strip():
                cnt += 1
                break

    return cnt

 우선 제 정답 코드입니다! 입력값에서 아기가 발음할 수 있는 words의 요소를 차례로 " "로 대체하였습니다. " "로 대체하는 것이 중요한데요. 예를 들어 'wyeoo'라는 단어는 아기가 발음할 수 없는 단어 입니다. 만약에 공백으로 대체 하지 않고 그냥 없애버리게 되면 'wyeoo' -> 'woo'가 되어 다음에 'woo'를 대체할 때 없어지게 되어 아기가 발음할 수 있는 단어로 판단되는 불상사가 일어나게 됩니다. 그래서 공백으로 대체하여 'w oo'로 만들어서 처리를 해주어야됩니다. 그리고 마지막에 공백을 벗기고 그 값이 ""이면 cnt를 1을 더해줍니다. 이 과정을 반복하면 아기가 말할 수 있는 단어의 총 갯수가 나오게 됩니다!

 프로그래머스 문제에서는 입력값으로 아기가 발음할 수 있는 단어는 최대1회까지만 주어진다고 되어있는데요, 저의 정답처럼 코드를 짜면 아기가 아무리 '아야아야아야'거려도 다 잡아낼 수 있습니다!!(너무 잔인한가..) 그렇다면 만약 아기가 각 단어들을 한 번씩만 말할 수 있다면 어떻게 해야 될까요

import re

def solution(babbling):   
    answer = 0
    for babble in babbling:
        find_babble = re.findall(r"(aya|ye|woo|ma)", babble)
        s = list(set(find_babble))
        if find_babble == s: ##중복값 제거한 리스트와 원래 리스트가 같다면
            if "".join(find_babble) == babble:        
                answer += 1

    return answer

 re모듈을 임포트해서 findall메서드를 사용했습니다! replace를 사용하게 되면 앞에서부터 대체를 끝까지 다 해버리기 때문에 안됩니다. s= list(set(find_babble))과 if find_babble == s: 이 두 줄이 없으면 위의 제 정답코드랑 동일한 코드가 됩니다. 아기가 발음할 수 있는 단어를 하나의 리스트로 만들고 중복값을 제거한 리스트와 리스트가 동일하다면 한번씩만 말한 것으로 정답이 되고 아니라면 2번 이상 말한 것이므로 오답이되는 원리입니다! 이 코드는 제가 직접 입력값을 넣어서 확인해보긴했으나, 정확히 정답 확인할 수는 없으므로 혹시 잘못된 점이 있다면 댓글로 알려주시면 감사하겠습니다!

 

 궁금하시거나 잘못된 내용이 있으면 댓글로 알려주세요~ 감사합니다!!

반응형
Comments