Tiny Bunny
coding test

[도서실습] 내일은 코딩테스트 with 파이썬(자료구조와 알고리즘의 기초부터 실전까지) 중 옹알이(1)

talstory
def solution(babbling):
    answer = 0
    for word in babbling:
        for pronunciation in ['aya', 'ye', 'woo', 'ma']:
            word = word.replace(pronunciation, '')
        if not word.strip():
            answer += 1
    return answer
a=' '
print(not a.strip()) #True
b=' ha'
print(not b.strip()) #False

문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
    • 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

입출력 예babblingresult
["aya", "yee", "u", "maa", "wyeoo"] 1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] 3

입출력 예 설명

입출력 예 #1

  • ["aya", "yee", "u", "maa", "wyeoo"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.

입출력 예 #2

  • ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye", "ye" + "ma" + "woo" = "yemawoo"로 3개입니다. 따라서 3을 return합니다.

유의사항
  • 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.

내 풀이:

 

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

 


1. `def solution(babbling):`: 함수 `solution`을 정의합니다. 이 함수는 `babbling`이라는 문자열 리스트를 인자로 받습니다.

2. `answer = 0`: 결과를 저장할 변수 `answer`를 0으로 초기화합니다.

3. `for word in babbling:`: `babbling` 리스트에 있는 각각의 단어에 대해 반복합니다.

4. `for pronunciation in ['aya', 'ye', 'woo', 'ma']:`: 각 단어에서 'aya', 'ye', 'woo', 'ma' 발음을 하나씩 확인합니다.

5. `word = word.replace(pronunciation, ' ')`: 단어에서 현재 발음 `pronunciation`을 공백으로 대체합니다.

6. `if not word.strip():`: 만약 단어가 모두 공백으로만 이루어져 있다면(즉, 이어붙인 발음이라면),

7. `answer += 1`: `answer` 값을 1 증가시킵니다.

8. `return answer`: 최종적으로 `answer` 값을 반환합니다. 이 값은 이어붙인 발음으로 이루어진 단어의 개수를 나타냅니다.

이 코드는 각 단어에서 주어진 발음들을 공백으로 대체한 후, 그 결과가 모두 공백인지를 확인하여 이어붙인 발음으로 이루어진 단어의 개수를 세는 것입니다.

 

strip 메소드: strip() 메서드는 문자열의 양쪽에 있는 공백만 제거하므로, 중간에 있는 공백은 그대로이다.


`word.strip()`는 문자열 `word`의 양쪽 공백을 제거한 결과를 반환합니다. 그리고 `not word.strip()`는 만약 `word`가 모두 공백으로만 이루어져 있다면 (즉, 이어붙인 발음이라면) True가 됩니다.

예를 들어, 단어 'ayahaye가 낀 경우에는 단어들을 공백으로 대체하고 난 뒤에는  "   ha   "와 같은 형태가 됩니다. 이때 `strip()` 함수를 사용하면 양쪽의 공백이 제거되어 "ha"가 됩니다. 그런데 여기서 `not word.strip()`는 False가 됩니다. 왜냐하면 공백이 아니기 때문입니다. 

하지만 이어붙인 발음으로 이루어진 단어를 생각해보면, 그 안에는 어떤 문자도 없는 빈 문자열이 됩니다. 따라서 이때 `strip()` 함수를 사용하면 빈 문자열이 됩니다. 그리고 `not word.strip()`는 True가 됩니다. 



즉, `if not word.strip():`는 단어가 모두 공백으로만 이루어져 있다면 (즉, 이어붙인 발음이라면)를 확인하는 조건문입니다.

 


참고:

def solution(babbling):
    answer = 0
    for word in babbling:
        for pronunciation in ['aya', 'ye', 'woo', 'ma']:
            word = word.replace(pronunciation, '') # ' '를 ''로 변경
        if not word.strip():
            answer += 1
    return answer

 

공백을 없애면 어떻게 될까?

 

테스트 1
입력값 ["aya", "yee", "u", "maa", "wyeoo"]
기댓값 1
실행 결과 실행한 결괏값 2이 기댓값 1과 다릅니다.
테스트 2
입력값 ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]
기댓값 3
실행 결과 테스트를 통과하였습니다.

다음과 같은 결과가 나온다.

이는 이전 풀이에서 [" "," e", "u", " a", "w oo"]였던 부분이 ["","e", "u", "a", ""]로 바뀌면서 결과값이 2개가 나온다.

차이가 되는 부분은 다음과 같다.

babbling1 = ["wyeoo"]

answer = 0
for word in babbling1:
    for pronunciation in ['aya', 'ye', 'woo', 'ma']:
        word = word.replace(pronunciation, '')
    print(word)
    if not word.strip():
        answer += 1
print(answer)

 

"wyeoo"가 "woo"가 되고 ""가 된다.

 

이 코드는 발음을 빈 문자열로 대체하여 문자열에서 발음이 모두 사라지면 이어붙인 발음이라고 판단한다. 모든 발음을 제거한 뒤에 문자열이 공백으로 남지 않아서, w oo를 woo로 체크하는 오류가 발생한다.

 


 

다른 사람 풀이(1)

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

 

  1. for i in babbling:: 입력으로 받은 문자열 리스트 babbling의 각각의 단어를 반복합니다.
  2. for j in ['aya','ye','woo','ma']:: 이어붙인 발음이 되기 위해서는 "aya", "ye", "woo", "ma"의 발음이 각각 한 번씩만 나타나야 합니다.  연속해서 두 번 등장하지 않는지를 확인하기 위해 각각의 발음에 대해서 반복합니다.
  3. if j*2 not in i:: 이어붙인 발음인지 확인하기 위해 해당 발음을 두 번 이상 연속해서 포함하는지 확인합니다. 만약 해당 발음이 두 번 이상 연속해서 포함되어 있지 않다면, 해당 발음을 공백으로 대체합니다.
  4. if not i.rstrip():: 문자열에서 오른쪽에 있는 공백을 제거한 후에 문자열이 빈 문자열이 되었는지 확인합니다. 만약 빈 문자열이라면, 해당 단어는 이어붙인 발음으로 이루어져 있는 것으로 간주하고, answer 값을 1 증가시킵니다.
  5. 마지막으로, 함수는 answer 값을 반환하여 이어붙인 발음으로 이루어진 단어의 개수를 반환합니다.

'coding test' 카테고리의 다른 글

3월에 태어난 여성 회원 목록 출력하기  (0) 2024.04.05

댓글