https://school.programmers.co.kr/learn/courses/30/lessons/133499
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
입출력 예
babbling | result |
["aya", "yee", "u", "maa"] | 1 |
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] | 2 |
풀이 과정
# Point!
# 이전 옹알이(1) 에서는 네 가지 발음을 최대 한 번씩만 사용 가능했기에 가능한 발음이 있다면 '1'로 변환하고
그 결과 숫자('1')만 남는다면 발음 가능한 단어로 판정했었다
옹알이 (2) 는 연속해서 같은 발음을 하지만 않는다면 여러 번 사용할 수 있기에 다른 방식으로 판정해야 한다.
- ["ayaye", "uuuma", "yeye", "yemawoo", "ayaayaa"]에서 발음할 수 있는 것은 2개 이다.
- "aya" + "ye" = "ayaye",
- "ye" + "ma" + "woo" = "yemawoo"
- "yeye"는 같은 발음이 연속되므로 발음할 수 없다.
처음 작성한 코드
# 무한 루프를 돌며 단어 내에 발음이 존재하고 연속되지 않는 경우 숫자로 변경한다
# 연속된 발음을 하는지 체크하기 위해 변경할 숫자는 발음 배열의 해당 인덱스를 문자로 변경해 사용한다
# replace() 함수를 사용하면 한 번에 모두다 변경되기 때문에 1을 파라미터로 넣어 하나씩 변경
def solution(babbling):
pronuns = ["aya", "ye", "woo", "ma"]
answer = 0
for word in babbling: # 단어 하나씩 순회
word = 'x'+word+'x' # out of index
flag = 1
# 변환을 시행하지 않으면(flag==0) 종료
while flag:
flag = 0
for pro in pronuns: # 발음 하나씩 순회
idx = word.find(pro) # 변환할 단어의 위치, index() 대신 find() 사용 -> 없는 경우 return -1
change_str = str(pronuns.index(pro)) # 연속해서 발음할 수 없도록 해당 발음을 숫자로 변경
# 변환 가능한 경우(해당 발음이 존재 and 연속하지 않는다면)
if idx != -1 and word[idx-1] != change_str:
word = word.replace(pro,change_str,1) # 하나씩 변환
flag = 1 # 변환 시행
if word[1:-1].isdigit(): answer +=1; break # 단어가 모두 숫자로 변환됐다면 루프 종료
문제점
# 한 번에 한 단어만 변경하기 때문에 시간복잡도에서 불리하다
# 무한루프를 벗어나는 조건을 만들기 위해 flag 사용
# 연속되는 발음을 인덱스로 검사하다보니 가독성이 좋지 않다
처음 문제를 풀 때는 연속되는 발음을 검사하는 아이디어가 생각나지 않아 어떻게든 풀어보자는 생각에 코드를 작성했다
정답은 맞췄지만 지금보니 많이 조잡하다 ㅡ,.ㅡ

리펙토링한 전체 코드
# 연속되는 경우를 인덱스를 사용하지 않고 pronun*2 를 통해 검사
def solution(babbling):
answer = 0
for word in babbling:
for pro in ["aya", "ye", "woo", "ma"]:
if pro * 2 not in word:
word=word.replace(pro,'1')
if word.isdigit():
answer+=1
return answer
많이 깔끔(?) 해졌다
다른 사람의 코드
예술의 경지에 이른 신기한 코드.
이중 for문을 사용하지 않고 한번에 해결
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
'Coding Test > Implementation' 카테고리의 다른 글
[프로그래머스] 172928번 공원 산책 (Python 파이썬) (0) | 2023.07.27 |
---|---|
[프로그래머스] 160586번 대충만든 자판 (Python 파이썬) (0) | 2023.07.27 |
[프로그래머스] 136798번 기사단원의 무기 (Python 파이썬) (0) | 2023.07.25 |
[프로그래머스] 42840번 모의고사 (Python 파이썬) (1) | 2023.07.25 |
[프로그래머스] 142086번 가장 가까운 글자 (Python 파이썬) (0) | 2023.07.25 |