일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바
- 그리디알고리즘
- 롤
- 탐욕알고리즘
- java
- lol
- 장고
- 라이엇
- 그리디
- 알고리즘
- API
- programmers
- 코딩테스트준비
- greedy
- 파이썬
- 스파르타내일배움캠프TIL
- 백준
- 스파르타내일배움캠프
- git
- github
- sort
- 내일배움캠프
- 코딩테스트
- drf
- 리그오브레전드
- Riot
- python
- Django
- 프로그래머스
- SQL
- Today
- Total
Lina's Toolbox
[프로그래머스] 옹알이 (2) 본문
문제 설명
머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ babbling의 길이 ≤ 100
- 1 ≤ babbling[i]의 길이 ≤ 30
- 문자열은 알파벳 소문자로만 이루어져 있습니다.
입출력 예
babbling | result |
["aya", "yee", "u", "maa"] | 1 |
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] | 2 |
입출력 예 설명
입출력 예 #1
["aya", "yee", "u", "maa"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.
입출력 예 #2
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은
"aya" + "ye" = "ayaye", "ye" + "ma" + "woo" = "yemawoo"로 2개입니다. "yeye"는 같은 발음이 연속되므로 발음할 수 없습니다. 따라서 2를 return합니다.
유의사항
네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다.
예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.
문제 풀이
def solution(babbling):
answer = 0
valid_sounds = ["aya", "ye", "woo", "ma"]
for b in babbling:
# 연속해서 같은 발음 하지 못함
if "ayaaya" in b or "yeye" in b or "woowoo" in b or "mama" in b:
continue
for v in valid_sounds:
b = b.replace(v, " ")
if b.strip() == "":
answer += 1
return answer
replace(v, " ")이 아닌 replace(v, "")를 할 경우,
남은 문자열끼리 거짓된 유효한 발음을 만드는 문제가 있었다.
예를들어,
"myea" 라는 문자열이 babbling 안에 있었다고 가정해보자.
myea에는 aya가 없으므로 첫번째 루프는 패스,
그리고 ye라는 발음이 있으므로 ye를 제거해준다. 이때 띄어쓰기(" ")가 아닌 그냥 빈 문자열("")로 replace 해준다면,
myea ➡️ ma 가 될것이다.
ma는 valid_sounds에 포함되므로
"myea" 는 아기가 발음할 수 있는 단어네! 로 착각하는 경우가 발생하는 것이다.
이를 방지하기 위해, valid_sounds 를 체크할 때 까지는 " " 띄어쓰기로 replace하여 구분하고,
마지막에 strip()으로 빈문자열로 완전히 바꿔주었다.
다른 풀이
import re
def solution(babbling):
# 유효한 발음 조합을 검증하는 정규 표현식 패턴
pattern = re.compile(r"^(aya|ye|woo|ma)+$")
def is_valid(babbling_word):
# 연속된 발음이 있는지 확인
if re.search(r"(aya){2}|(ye){2}|(woo){2}|(ma){2}", babbling_word):
return False
return pattern.fullmatch(babbling_word) is not None
valid_count = sum(1 for word in babbling if is_valid(word))
return valid_count
# 예제 테스트
print(solution(["aya", "yee", "u", "maa"])) # Output: 1
print(solution(["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"])) # Output: 2
정규표현식을 사용하는 방법.
정규표현식을 사용하는 것이 가장 빠르고 정확한 방법일 것이다.
그런데 정규표현식은 늘 어려워서 gpt의 도움을 받았다.ㅠㅠ
def solution(babbling):
count = 0
for b in babbling:
if "ayaaya" in b or "yeye" in b or "woowoo" in b or "mama" in b:
continue
if not b.replace("aya", " ").replace("ye", " ").replace("woo", " ").replace("ma", " ").replace(" ", ""):
count += 1
return count
replace를 계속 붙여서 사용한게 인상깊었다!
굳이 반복문을 사용할 필요가 없었다는 걸 배웠다.
좋은 풀이인 것 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/133499
'문제 풀이 > programmers' 카테고리의 다른 글
[Greedy] programmers(프로그래머스) - 큰 수 만들기 (0) | 2024.10.01 |
---|---|
[프로그래머스] 체육복 (0) | 2024.08.11 |
[프로그래머스] 숫자 짝꿍 (0) | 2024.08.10 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2024.08.08 |
[프로그래머스] 문자열 나누기 (0) | 2024.08.05 |