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

Hyun·2023년 6월 19일
0

프로그래머스

목록 보기
18/32

문제 설명

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

제한사항
1 ≤ babbling의 길이 ≤ 100
1 ≤ babbling[i]의 길이 ≤ 30
문자열은 알파벳 소문자로만 이루어져 있습니다.
입출력 예
babbling: ["aya", "yee", "u", "maa"]
result: 1

문제 풀이

첫번째 풀이

def solution(babbling):
    answer = 0
    arr = ["aya", "ye", "woo", "ma", ""]
    for s in babbling:
        right = 1 
        idx = 0
        fw_idx = 4 #직전의 문자열의 arr내에서의 인덱스(초기값은 의미없는값)
        while True:
            # 처음부터 한글자의 문자열이거나, 한글자밖에 안남은 경우 -> 무조건 잘못된 경우
            if len(s) == 1 or idx == len(s)-1:
                right = 0
                break
            # idx+=2 또는 idx+=3 이후 탐색 범위를 넘어선 경우 -> 성공
            elif idx == len(s):
                break
        
            # 현재 문자열이 직전에 존재했던 경우
            if fw_idx != 4 and (arr[fw_idx] == s[idx: idx+2] or arr[fw_idx] == s[idx: idx+3]):
                right = 0
                break
            # 두글자의 문자열이 유효한 문자열인 경우
            elif s[idx:idx+2] in arr:
                fw_idx = arr.index(s[idx:idx+2])
                idx+=2
            # 세 글자의 문자열이 유효한 문자열인 경우
            elif s[idx:idx+3] in arr:
                fw_idx = arr.index(s[idx:idx+3]) 
                idx+=3
            # 두글자, 세글자 모두 유효한 문자열이 없는 경우
            else:
                right = 0
                break;
        if right: answer+=1
            
    return answer

두번째 풀이

흐름
1. 먼저 검사할 문자열에 유효한 발음 문자열이 연달아 존재하는지 검사한다. 이때 몇개가 연달아 존재하는지는 상관X.
2. 같은 문자열이 연달아 존재하지 않으면 해당 문자를 지워버린다. but, 어떻게 지울것인가?

그냥 지우면 "wooyewoo"와 같은 경우, "woowoo"가 남게 되서 연달아 존재하도록 되어버림, 잘못된 방법, 그럼 지우긴 하는데 어떻게 연달아 안 모이도록 하지?

=> 지운 자리에 공백 " "을 남겨서 연달아 모이는걸 방지한다.
그럼 유효한 발음 문자열이 연달아 존재하지 않았을때 해당 유효 발음 문자열을 다 지워버리면 통과 케이스인 경우 공백으로 이뤄진 문자열만 남게된다. 따라서 좌우 공백을 지우는 strip을 이용해 지워버리면 남은 길이가 0이 되게 된다.

def solution(babbling):
    answer = 0
    
    for bab in babbling:
        for word in ["aya", "ye", "woo", "ma"]:
            if word in bab:
                # 같은 문자열 연달아 존재O
                if word*2 in bab: 
                    break
                # 같은 문자열 연달아 존재X => 해당 문자열을 공백으로 대체한 후 재검
                else: 
                    bab=bab.replace(word, " ")
        if len(bab.strip()) == 0:
            answer+=1
    
    return answer
profile
better than yesterday

0개의 댓글