옹알이

뚝딱이·2022년 10월 12일
0

코딩 테스트 준비

목록 보기
8/8

문제 설명

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

문제는 위와 같고, 제한 사항이나 입력 및 출력 형식등은 프로그래머스 홈페이지를 참조하자

구현 방식

구현 해야할 기능

  1. babbling을 발음할 수 있는지 검색

  2. babbling에 연속해서 같은 발음하는 것이 있는지 검색

babbling과 발음할 수 있는 단어들을 for문을 돌려 각각의 메서드를 실행했다.
먼저 메서드를 살펴보면,

findWords

def findWords(word, babble): #word안에 babble이 어느 위치에 있는지 list로 반환
    index = 0
    find = []
    while index>-1: # find는 word안에 babble이 없을 경우 -1을 리턴하므로 words안에 babble을 찾을 때까지
        index = word.find(babble, index)
        if index > -1: # words에서 babble을 찾은 경우
            find.append(index) 
            index += len(babble) # 검색 시작 위치를 찾은 단어 뒤로 설정
    return find

먼저 babbling의 단어와 발음을 입력받아 해당 단어에 발음이 어느위치에 있는지 find함수를 이용하여 find 리스트에 index를 담았다.
예를 들어 'ayaayaa'와 같다면 aya가 각각 0번째와, 3번째에 있으므로 find는 [1,3]이 될 것이다.

checkContinued

def checkContinued(find, length) : # 연속된 발음인지 check 만약 find의 길이가 1이면 check 할 필요없음
    if len(find) == 1 : return True # find의 길이가 1이면 연속된 발음이 있을 수 없으므로 true 반환

    for i in range(len(find)-1) : # find를 돌아가며 연속된 발음이 있는지 확인
        if find[i+1]-find[i]==length :
            return False # 연속된 발음이라면 false
    return True # 없다면 true

발음이 해당 단어 어디에 있는지를 담은 find와 발음의 길이를 받은 함수이다.
만약 해당 단어에 발음이 한번만 있다면, 연속된 발음을 검사하지 않아도 된다. 예를 들어 'ayaa'같은 경우 aya가 한번 들었으니 ayaa의 find는 [0]일 것이다. 따라서 find의 길이가 1인 경우 연속에 대한 검사를 하지 않아도 된다.

하지만 find의 길이가 2이상인 경우 검사를 해야한다.
예를 들어 'ayaayaa'의 경우 aya에 대한 find가 [0,3]이다. 이 때 find의 요소들의 차가 발음의 길이와 같다면 그것은 발음이 연속된 것이다. 위와 같은 경우라면, find[1] - find[0]이 3인데 aya의 길이 또한 3이므로 이는 발음이 연속된 경우이다. 따라서 이런 경우엔 False를 반환해 이것은 발음이 연속된 경우임을 알려 해당 단어에 대한 검사는 끝내도 됨을 알린다.

위와 같은 방법도 있지만, 다른 사람의 풀이에서 정말 간단한 풀이를 봤다.
연속된 발음을 찾을 때 발음 + 발음이 단어 안에 있는지 확인하면 되는 것이다.
예를 들어 ["aya", "ye", "woo", "ma" ]를 pronun이라고 한다면

for i in babbling :
	for j in pronun : 
    	if j+j in i:
        	break
        else ~

와 같이 j+j를 활용할 수 있는 것이다.

처음엔 나도 파이썬의 in을 이용해서 발음이 babbling의 단어 안에 있으면 해당 발음을 단어에서 삭제하는 방식으로 문제를 해결하려고 했는데, 연속된 발음을 해결할 방법을 찾지 못해 그 방법을 사용하지 못했다. 하지만 위와 같이 j+j가 i에 있을 땐 i에 대한 검사를 실행하지 않고 i안에 연속된 발음이 없는 경우 j를 ''로 replace를 이용해 대체, 즉 삭제하고 마지막에 i가 ''이 된다면 answer에 값을 더하고 i에 문자가 존재한다면 다음 i를 검사하는 방식으로 문제를 해결할 수 있다.

solution

   
def solution(babbling):
    answer = 0
    pronunciation = ["aya", "ye", "woo", "ma" ]
    
    for i in babbling:
        word_len = 0
        for j in pronunciation :
            find = findWords(i,j)
            if checkContinued(find,len(j)) == False :
                break
            word_len += len(j)*len(find) # word안에 babble이 들어있는 문자 길이 -> ayaayaa의 경우 6
        if word_len == len(i) : # word안에 babble이 들어있는 문자 길이를 다 합쳤을 때 원래 문자의 길이와 같다면, 이 문자는 babble로 이루어진 문자이므로 answer에 1더하기
            answer += 1
            
    return answer

i에 j가 어디에 있는지 index를 담은 find를 찾고, find에 대해 연속된 발음이 있는지 검사한 후 있다면 i에 대한 검사를 중단하고 다음 i로 넘어가고 연속된 발음이 없다면 find에서 찾은 j의 개수와 j의 길이를 곱한다. 이는 단어에 들어있는 발음의 개수가 된다. 예를 들어 'ayayeaya'일 때 aya에 대한 find는 [0,5]일 것이고, 'ayayeaya'안에는 총 len(find) * len('aya') = 6만큼의 발음이 들어있다. 이러한 검사를 각각의 j에 다해서 총 합산했을 때 i의 길이와 같으면 이 i는 j로 이루어진 단어이므로 조카가 발음할 수 있다. 따라서 answer에 1을 더하면 된다.

문제점

문제를 너무 복잡하게 풀었다.
설명을 하기 위해 어느정도 틀을 짜고 예를 들어도 충분히 설명이 안되는 느낌이 든다.

문자열을 연속으로 합친게 (예를 들어 for j in pronun : if j+j in i) 단어 안에 있다는 것을 예시와 같이 축약하는 아이디어를 떠올리는 것과 replace를 통해 찾은 발음은 제거하는 것이 중요한 것 같다.

중요 키워드는 in, str+str, replace가 될 것이다.

profile
백엔드 개발자 지망생

0개의 댓글