[Programmers][Py] 옹알이 (2)

mj·2024년 8월 29일
0

코딩테스트문제

목록 보기
48/50
post-custom-banner

✅ 문제

문제 바로가기



✅ 나의 풀이

def solution(babbling):
    answer = 0
    
    for word in babbling:
    	# 1. 옹알이 숫자로 치환하기
        word = word.replace("aya", "1")
        word = word.replace("ye", "2")
        word = word.replace("woo", "3")
        word = word.replace("ma", "4")
        
        # 2. 옹알이 유효성 검사
        if word.isdigit():
            for i in range(len(word)-1):
                if word[i] == word[i+1]: break
            else:
                answer += 1
            continue
        else:
            continue  
        
    return answer

1️⃣ 옹알이 숫자로 치환하기

조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음만 가능하다.
좀 더 쉽게 유효성 검사를 하기 위해 옹알이를 문자열 숫자로 바꿔주었다.

	"aya" → "1"
	"ye" → "2" 
	"woo" → "3"
	"ma" → "4"
        word = word.replace("aya", "1")
        word = word.replace("ye", "2")
        word = word.replace("woo", "3")
        word = word.replace("ma", "4")



2️⃣ 유효성 검사

조카가 발음할 수 있는 단어의 조건

1) 네 가지 발음"aya", "ye", "woo", "ma"과 이것을 조합한 발음
2) 단, 반복되는 발음이어서는 안됨. ("yeye"는 불가능, "yemaye"는 가능)


1) 네 가지 발음과 이것을 조합한 발음

만약, 발음가능한 단어들의 조합으로 이루어져있다면 1단계 치환을 거치고 난 뒤 모든 문자는 정수일것이다.
ex) "ayayeaya""121"

발음할 수 없는 단어가 하나라도 있다면 알파벳이 남아있게 된다.
ex) "yes""2s"

따라서, 1단계 이후에 문자는 모두 정수이어야 발음가능하다.

if word.isdigit():

2) 단, 반복되는 발음이어서는 안됨

"yemaye"는 가능하지만, "yeye"처럼 같은 발음이 연속으로 중복되어서는 안된다.

for i in range(len(word)-1):
	if word[i] == word[i+1]: break
else:
	answer += 1

for문을 사용하여 연속으로 중복된 정수가 있는지 확인하였다.



✅ 다른 풀이

알고리즘

  1. 연속으로 같은 발음 나오는지 확인하기
  2. 아닌 경우, 옹알이를 빈 문자로 치환한다.
  3. 최종 문자열이 빈 문자열인 경우 answer +1

연속으로 같은 발음 나오는 경우 처리하기

예를들어 "aya"가 연속으로 중복되었는지 확인하려면, 문자열에 "ayaaya"가 하나라도 있는지 확인하면 된다.
"ayaayaayaaya", "ayaaya" 모두 "ayaaya"가 하나라도 있으므로 발음불가능한 단어이다.

# 예시1
for j in ['aya','ye','woo','ma']:
            if j*2 not in i:
                i=i.replace(j,' ')
# 예시2
if "ayaaya" in b or "yeye" in b or "woowoo" in b or "mama" in b:
            continue



Error/실수

  • 첫 시도

    def solution(babbling):
        answer = 0
    
        for word in babbling:
    
            for ex in ["aya", "ye", "woo", "ma"]:
                word = word.replace(ex, "", 1)
    
            if word == "":
                answer += 1
    
        return answer

    연속해서 같은 발음을 하지 못한다는 것을 간과했다...
    위의 코드는 "yeye"도 발음가능하다고 판단하므로 잘못된 코드이다.

  • replace()는 원본값을 변경하지 않고 바뀐 값을 리턴한다.
    따라서 replace()의 반환값을 다시 변수에 할당해주어야 한다.

    word = word.replace("aya", "1")



Comment

🌀 특정 문자열 제거하는 방법: replace()

str = str.replace("abc", "")

처음에 문제 요구사항을 잘못이해해서 연속된 문자도 발음가능하도록 했다. 요구사항 분석을 꼼꼼히 하자.
풀이 방법을 떠올리는것은 쉬웠으나 연속으로 반복될수 없는 조건을 코드로 구현하는데 오래 걸렸다. 구현하는 연습을 계속하자.

profile
일단 할 수 있는걸 하자.
post-custom-banner

0개의 댓글