Algorithm

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

비번변경 2023. 8. 10. 23:03

문제

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

머쓱이가 돌보는 조카는 "aya", "ye", "woo", "ma", 그리고 이 네 가지 발음을 조합해 만들 수 있는 발음 밖에 하지 못한다. 그리고 연속해서 같은 발음을 하는 것을 어려워한다.

입력으로 문자열 배열 babbling이 주어지면 머쓱이의 조카가 발음할 수 있는 단어의 개수는 몇 개인가?

 

 

내 풀이

단순하게 접근했다.

 

1. 문자열 b이 조카가 발음할 수 있는 문자열 defi로 시작하는지 확인한다. 단, 이전에 발음한 문자열 pre이 아니어야 한다.

2. 만약 조건에 맞으면 발음한 문자열 pre을 갱신하고, 문자열 b를 문자열 defi 길이만큼 앞에서 자른다.

3. 1~2의 과정을 문자열 b가 ''가 아닐 때까지 반복하되, 조건에 맞지 않으면 바로 빠져나온다.

4. 반복문을 빠져나온 후 문자열 b가 비어있으면 조카가 발음할 수 있는 문자열에 해당한다.

5. 1~4의 과정을 입력 문자열 배열 babbling 만큼 반복한다.

def solution(babbling):
    defi = ["aya", "ye", "woo", "ma"]
    answer = 0
    for b in babbling:
        pre = ''
        while b != '':
            if pre != defi[0] and b.startswith(defi[0]):
                pre = defi[0]
                b = b[len(defi[0]):]
            elif pre != defi[1] and b.startswith(defi[1]):
                pre = defi[1]
                b = b[len(defi[1]):]
            elif pre != defi[2] and b.startswith(defi[2]):
                pre = defi[2]
                b = b[len(defi[2]):]
            elif pre != defi[3] and b.startswith(defi[3]):
                pre = defi[3]
                b = b[len(defi[3]):]
            else:
                break
        if not b:
            answer += 1
    
    return answer

 

 

다른 사람 풀이

훨씬 좋은 풀이가 있어 적어둔다.

 

1. 문자열 b가 조카가 발음할 수 있는 단어의 연속을 포함하는지 확인한다.

2. 포함하고 있지 않으면 조카가 발음할 수 있는 단어를 공백 ' '이나 다른 문자로 치환한다. 공백 ''로 치환하면 연속적이지 않았던 발음이 연속으로 취급될 수 있으므로 주의한다.

3. 치환한 문자를 제거했을 때 문자열이 남아있지 않으면 조카가 발음할 수 있는 문자열에 해당한다.

def solution(babbling):
    answer = 0
    for b in babbling:
        for d in ["aya", "ye", "woo", "ma"]:
            if d * 2 not in b:
                b = b.replace(d, ' ')
        if not b.strip():
            answer += 1
    
    return answer

 

 

참고 문서

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