기본기 다지기/코테 오답노트

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

syveany 2025. 3. 4. 16:24

내 풀이를 바탕으로 지피티와 함께 조금 다듬어봤다. 

 

[문제]

애기가 옹알이로 할 수 있는 말의 개수를 구하는 문제였다.

아직 4가지 단어만 말 할 수 있고, 애기기 때문에 연속해서 같은 단어를 발음하지 못한다.

 

 

 

[코드]

내 코드이다.

먼저 슬라이싱으로 처리하기 위해서 2글자 단어('ye', 'ma')와 3글자 단어('aya', 'woo')가 등장했을 때의 2가지 경우로 나눴다.

각 경우에서 babble의 앞 단어가 애기가 발음할 수 있는 단어이면, front_word라는 단어에 그 단어를 추가하고 babble에서 그 단어를 없애줬다.

 

여기서 추가한 단어가 기존의 front_word 단어와 같으면 발음할 수 없으므로 break.

babble의 앞단어가 애기가 발음할 수 없는 단어여도 바로 break.

babble에 아무것도 남지 않으면 애기가 단어를 모두 발음할 수 있다는 뜻이므로 answer 개수를 1 올려주고 break.

 

아니면 while문 안에서 이 과정이 계속 반복된다.

 

(+ 요새 실수를 줄이기 위해서 각 단계마다 print해서 보는 방법을 사용하고 있다. 확실히 실수가 줄어드는 것 같다.)

def solution(babbling):
    answer = 0
    for babble in babbling:
        # print('---new babble---')
        front_word = []
        while True:
            if babble[:2] == 'ye' or babble[:2] == 'ma':
                front_word.append(babble[:2])
                babble = babble[2:]
                # print(f'1, fr = {front_word}, bab = {babble}')
                if len(front_word) >= 2 and front_word[-2] == front_word[-1]:
                    # print('같은 단어 반복됨 (종료)')
                    break
            elif babble[:3] == 'aya' or babble[:3] == 'woo':
                front_word.append(babble[:3])
                babble = babble[3:]
                # print(f'2, fr = {front_word}, bab = {babble}')
                if len(front_word) >= 2 and front_word[-2] == front_word[-1]:
                    # print('같은 단어 반복됨 (종료)')
                    break
            else:
                # print('해당 단어 없음 (종료)')
                break
            if babble == '':
                answer += 1
                # print('정답!')
                break
            elif babble != '':
                # print('continue')
                continue
    return answer

 

 

 

[개선된 코드]

지피티는 valid_words를 리스트로 만들어두고, startswith 함수를 써서 풀었다. (이런 함수가 있었다니..)

처음에 글자수에 따라서 경우를 나누지 않아도 되니 확실히 코드가 간결해졌다.

흠.. 근데 너무 while for if if 이긴 하다.. 흠 . 내 코드에서 마지막 continue 부분만 없애면 내 코드가 나은 것 같기도 하고..

def solution(babbling):
    valid_words = ["aya", "ye", "woo", "ma"]
    answer = 0
    
    for babble in babbling:
        prev_word = ""
        while babble:
            found = False
            for word in valid_words:
                if babble.startswith(word):
                    if prev_word == word:
                        found = False
                        break
                    babble = babble[len(word):] 
                    prev_word = word
                    found = True
                    break
            if not found: 
                break
        if not babble: 
            answer += 1
            
    return answer

 

 

 

[느낀점]

startswith 함수가 있구나.. 파이썬 내장함수가 끝도 없이 발견된다 .. 

이런 게 있다 정도만 알아두자