본문 바로가기

Coding Test/Implementation

[프로그래머스] 133499번 옹알이 (2) (Python 파이썬)

https://school.programmers.co.kr/learn/courses/30/lessons/133499

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

 

입출력 예

babbling result
["aya", "yee", "u", "maa"] 1
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] 2

풀이 과정

# Point!

# 이전 옹알이(1) 에서는 네 가지 발음을 최대 한 번씩만 사용 가능했기에 가능한 발음이 있다면 '1'로 변환하고

   그 결과 숫자('1')만 남는다면 발음 가능한 단어로 판정했었다

   옹알이 (2) 는 연속해서 같은 발음을 하지만 않는다면 여러 번 사용할 수 있기에 다른 방식으로 판정해야 한다.

  • ["ayaye", "uuuma", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은 2개 이다.
  • "aya" + "ye" = "ayaye",
  • "ye" + "ma" + "woo" = "yemawoo"
  • "yeye"는 같은 발음이 연속되므로 발음할 수 없다.

 

처음 작성한 코드

# 무한 루프를 돌며 단어 내에 발음이 존재하고 연속되지 않는 경우 숫자로 변경한다

# 연속된 발음을 하는지 체크하기 위해 변경할 숫자는 발음 배열의 해당 인덱스를 문자로 변경해 사용한다

# replace() 함수를 사용하면  한 번에 모두다 변경되기 때문에 1을 파라미터로 넣어 하나씩 변경

def solution(babbling):
    pronuns = ["aya", "ye", "woo", "ma"]
    answer = 0
    
    for word in babbling:           # 단어 하나씩 순회
        word = 'x'+word+'x'         # out of index
        flag = 1
		
        # 변환을 시행하지 않으면(flag==0) 종료
        while flag:
            flag = 0
            for pro in pronuns:							# 발음 하나씩 순회
                idx = word.find(pro)                    # 변환할 단어의 위치, index() 대신 find() 사용 -> 없는 경우 return -1
                change_str = str(pronuns.index(pro))    # 연속해서 발음할 수 없도록 해당 발음을 숫자로 변경
                
                # 변환 가능한 경우(해당 발음이 존재 and 연속하지 않는다면)
                if idx != -1 and word[idx-1] != change_str:
                    word = word.replace(pro,change_str,1)      # 하나씩 변환
                    flag = 1                                   # 변환 시행

            if word[1:-1].isdigit(): answer +=1; break         # 단어가 모두 숫자로 변환됐다면 루프 종료

문제점

# 한 번에 한 단어만 변경하기 때문에 시간복잡도에서 불리하다

# 무한루프를 벗어나는 조건을 만들기 위해  flag 사용

# 연속되는 발음을 인덱스로 검사하다보니 가독성이 좋지 않다

 

처음 문제를 풀 때는 연속되는 발음을 검사하는 아이디어가 생각나지 않아 어떻게든 풀어보자는 생각에 코드를 작성했다

정답은 맞췄지만 지금보니 많이 조잡하다  ㅡ,.ㅡ

 

리펙토링한 전체 코드

# 연속되는 경우를 인덱스를 사용하지 않고 pronun*2 를 통해 검사

def solution(babbling):
    answer = 0

    for word in babbling:
        for pro in ["aya", "ye", "woo", "ma"]:
            if pro * 2 not in word:
                word=word.replace(pro,'1')
        if word.isdigit():
            answer+=1

    return answer

많이 깔끔(?) 해졌다

 

 

다른 사람의 코드

예술의 경지에 이른 신기한 코드.

이중 for문을 사용하지 않고 한번에 해결

 

def solution(babbling):
    count = 0

    for b in babbling:
        if "ayaaya" in b or "yeye" in b or "woowoo" in b or "mama" in b:
            continue    
        if not b.replace("aya", " ").replace("ye", " ").replace("woo", " ").replace("ma", " ").replace(" ", ""):
            count += 1

    return count