프로그래머스 0단계 문제인 옹알이(1)를 풀어보았다.
당연히 0단계니 알고리즘을 공부할필요도 없이 기본적인 언어별 문법만 숙지하면 풀 수 있겠지 하고 바로 문제풀이로 들어갔다.
문제를 좀 풀고 나니까 너무 쉬운 문제였는데, 처음 풀떄는 replace라는 내장함수도 몰라서 정말 어렵게 생각해서 itertools패키지에 permutations, 즉 순열 함수를 사용해서 풀었다.
아래는 파이썬으로 해결한 풀이 코드 이다.
from itertools import *
def doPermutations(num):
return permutations(["aya", "ye", "woo", "ma"],num)
def solution(babbling):
answer = 0
for oneBabbling in babbling:
length=len(oneBabbling)
if(length<=3):
permutated=doPermutations(1)
breakSign=False
for i in permutated: #(a,b,c) (c,b,a)
if(breakSign==True):break
temp=""
for j in i:
temp+=j
if(temp==oneBabbling):
answer+=1
print(temp)
breakSign=True
break
elif(4<=length<=6):
permutated=doPermutations(2)
breakSign=False
for i in permutated: #(a,b,c) (c,b,a)
if(breakSign==True):break
temp=""
for j in i:
temp+=j
if(temp==oneBabbling):
answer+=1
breakSign=True
break
permutated=doPermutations(3)
if(breakSign==True): pass
else: breakSign=False
for i in permutated: #(a,b,c) (c,b,a)
if(breakSign==True):break
temp=""
for j in i:
temp+=j
if(temp==oneBabbling):
answer+=1
print(temp)
breakSign=True
break
elif(7<=length<=9):
permutated=doPermutations(3)
breakSign=False
for i in permutated: #(a,b,c) (c,b,a)
if(breakSign==True):break
temp=""
for j in i:
temp+=j
if(temp==oneBabbling):
answer+=1
print(temp)
breakSign=True
break
permutated=doPermutations(4)
if(breakSign==True): pass
else: breakSign=False
for i in permutated: #(a,b,c) (c,b,a)
if(breakSign==True):break
temp=""
for j in i:
temp+=j
if(temp==oneBabbling):
answer+=1
print(temp)
breakSign=True
break
elif(10<=length):
permutated=doPermutations(4)
breakSign=False
for i in permutated: #(a,b,c) (c,b,a)
if(breakSign==True):break
temp=""
for j in i:
temp+=j
if(temp==oneBabbling):
answer+=1
print(temp)
breakSign=True
break
return answer
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 가관이다.... 해결은했는데 코드가 길어지고 코테 첨해본 놈이 작성한 코드 다웠다.
설명하자면, 어차피 "aya", "ye", "woo", "ma" 이 4가지 문자열만으로 조합된 결과물만을 서칭해야하니, 저 4가지에서 1가지,2가지,3가지,4가지를 각각 가져와서 조합한다고 생각하였다.
그런데 그냥 조합이 아니고 순서에 상관있는, 즉 ayaye와 yeaya를 다르게 취급해야하므로 순열로 생각하고
4p1, 4p2, 4p3, 4p4 까지 해서 개수를 구하면 되겠다고 접근하였다.
그걸위해서 기본 패키지인 itertools에 permutations을 사용하였다.
검사할 문자열을 길이를 기준으로 분기를 나눌껀데,
길이가 3이하면 무조건 4p1 밖에 안된다. 왜냐면 당장 4p2만되도 가장 길이가 작은 ye,ma를 가져온다해도 길이가 4이상이기떄문이다
같은이유로 길이가 4이상 6이하면 4p2, 4p3 밖에 안된다.(4p1은 최대길이가 3이고, 4p4는 최소길이가 8이기 떄문이다)
그 이상의 길이들도 마찬가지로 분기를 나눌수 있는데, 정리하자면
len<=3 ---> 4p1
4<=len<=6 ---> 4p2 4p3
7<=len<=9 ---> 4p3 4p4
10<=len ---> 4p4
이렇게 정리할 수있다.
당연하지만, 전혀 위에처럼 복잡하게 생각할 필요없다.
그냥 문자열 하나식 가져와서 맨처음 인덱스를 조사하기시작해서 aya,ye,woo,ma중에 하나라도 있으면 ""로 치환하는걸 반복해서 최종적으로 치환이 더이상 안될때 문자열==""여야만 정답이므로 정답에 +1을 더하면 된다. 아래는 파이썬으로 작성한 코드이다.
굳이 처음인덱스만 검사하는이유는, wyeoo 이런것들도 ye검사해서 ""로치환하면 woo가 되고 이거를 woo를 검사하면 정답이 되기 떄문이다. 그래서 항상 검사한 문자열에 첫번쨰인덱스만 검사한다.
def solution(babbling):
answer=0
available=[ "aya", "ye", "woo", "ma"]
for index,onebabbl in enumerate(babbling):
while True:
index=-1
for one in available:
if(onebabbl.find(one)==0):
index=0
onebabbl=onebabbl.replace(one,"")
break
if(index==-1):break
if(onebabbl==""):
answer+=1
break
return answer