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

김멉덥·2023년 8월 5일
0

알고리즘 공부

목록 보기
77/171
post-thumbnail
post-custom-banner

문제

프로그래머스 연습문제


코드 구현

def solution(babbling):
    answer = 0

    speak = ["aya", "ye", "woo", "ma"]
    # speak에서 조합해서 완성되는 단어만 발음 가능
    # 같은거 두번을 조합해서는 발음 불가능

    # 네가지 발음과 정확히 똑같은 발음이 있는 경우 확인하기 -> 존재한다면 발음할 수 있으니 answer에 +1 해주고 다음 검사는 건너뛰도록 제거
    for bab in babbling:
        if(bab in speak):
            answer += 1
            babbling.remove(bab)

    # 발음할 수 있는지 검사하기
    for bab in babbling:
        can_speak = True        # 발음할 수 있는지 아닌지 확인하기 위한 변수
        while (len(bab) > 0):
            if ("aya" in bab):
                bab = bab.replace("aya", "1")
            if ("ye" in bab):
                bab = bab.replace("ye", "2")
            if ("woo" in bab):
                bab = bab.replace("woo", "3")
            if ("ma" in bab):
                bab = bab.replace("ma", "4")
            else:
                break

        if(bab.isdigit()):      # 완벽하게 숫자로 모두 다 replace 되었다면 -> 4가지를 붙여 만들 수 있는 발음들
            for i in range(len(bab)-1):     # 같은 발음을 연속으로 하는지 확인
                if(bab[i] == bab[i+1]):     # 연속으로 하는 발음이라면 -> 발음할 수 없음
                    can_speak = False       # False로 변경
                    break
        else:                   # 모두 완벽하게 숫자로 replace되지 않은 경우 (중간에 치환되지 못한 글자가 존재, 즉 발음할 수 없는 단어)
            can_speak = False   # False로 변경

        if(can_speak):      # 만약 can_speak가 True라면 -> 발음 가능
            answer += 1

    return answer


if __name__ == '__main__':
    print(solution(["aya", "yee", "u", "maa"]))
    print(solution(["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]))
    # 아래는 반례 케이스들
    print(solution(["yayae"]))                  # 0
    print(solution(["ayayeaya"]))               # 1
    print(solution(["ayayeye"]))                # 0
    print(solution(["ayayeayayeayaaya"]))       # 0
    print(solution(["ayayemaaya"]))             # 1
    print(solution(["yeye", "yeye"]))           # 0

풀이

  • 처음에는 replace(”aya”, “ “) 혹은 replace(”aya”, ““) 로 치환하여 공백 혹은 삭제하는 식으로 만들었는데, 이렇게 되면 중복되는 발음인지 아닌지를 검사할 때 너무 까다로웠다.
    • ex) “yeye”의 경우 그냥 빈칸이 되어버리거나 공백이 되어버리니 “ayaye” 같이 정답인 경우와 같은 값을 도출하여 이를 걸러내는게 어려웠음
  • 또한 replace(”aya”, ““) 로 삭제하듯이 치환해버리면 → 반례 케이스 중 "yayae" 같은게 제일 어려워진다.
    • 가운데에 존재하는 “aya” 가 삭제되면서 → “ye”가 남게 되니 이것도 삭제되고 → 결국 정답처리가 되어버림
  • 따라서 순서가 중요하다는걸 알게 되었다.
  • 공백이나 빈칸으로 치환하지 않고 숫자로 치환 → 치환 이후 모두 숫자로 치환되었는지 확인 → 모두 숫자로 치환되었다면 발음할 수 있는 단어들로 구성되긴 한 것 !!
    • 그러나 같은 숫자가 연속되는지 확인 → 연속된다면 발음할 수 없음
    • 이 모든 검사를 통과하면 → 발음할 수 있음 → answer + 1

What I learned

  • 생각해보니까 이미 같은게 두번 이상 반복되고 있으면 발음할 수 없는 상태니까 …
    if j*2 not in i: 로 j*2를 해서 “yeye" 같은 중복되는거 걸러내기 가능…
  • 중복되지 않는다면 → 공백으로 치환 → 모든걸 발음할 수 있는 글자라면 결국 공백들만 남게 됨 → 공백을 다 제거하면 len == 0 → answer + 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 len(i.strip())==0:
            answer +=1
    return answer

문자열 중복 제거 3가지 방법
참고 : https://11001.tistory.com/81

▶️ ’’.join(set(문자열))

  • 순서보장 X
s = 'aaabbbccc'
b = ''.join(set(s))
print(b)    # cba

▶️ ’’.join(dict.fromkeys(문자열))

  • 파이썬 3.6부터 dict가 순서보장 O
s = 'aaabbbccc'
a = ''.join(dict.fromkeys(s))
print(a)    # abc

▶️ ’’.join(OrderedDict.fromkeys(문자열))

  • 파이썬 3.6이전 버전에는 기본 내장 dict가 순서 보장 안되어서 사용했던 OrderedDict, 순서보장 O
from collections import OrderedDict
s = 'aaabbbccc'
a = ''.join(OrderedDict.fromkeys(s))
print(a)    # abc

문자열 공백 제거는 strip()
참고 : https://wikidocs.net/33017

▶️ str.strip() : 공백 제거

>>> ex_str = "   hello    "
>>> ex_str.strip()
# 'hello'

▶️ str.strip('특정문자') : 특정 문자를 모두 제거

>>>  'www.example.com'.strip('m') 
# 'www.example.co'

>>> 'www.example.com'.strip('w')
# '.example.com'

>>> 'www.example.com'.strip('cmowz.') 
# 'example'

▶️ str.lstrip() : 선행 문자만 지움

>>> url = 'https://wikidocs.net'

## strip() 을 사용했을 때, net 의 't'도 생략됨.
>>> url.strip('https://')

# 'wikidocs.ne'

## lstrip() 을 사용했을 때, 
>>> url.lstrip('https://')

# 'wikidocs.net'

▶️ str.rstrip() : 후행 문자만 지움

>>> url = 'https://wikidocs.net'
>>> url.rstrip('.net')

# 'https://wikidocs'
profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글