옹알이(1)

Bill·2023년 3월 26일
0
post-thumbnail

프로그래머스 0단계 문제인 옹알이(1)를 풀어보았다.

프로그래머스 옹알이 (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
profile
새로운 여정은 언제나 두렵고 동시에 흥미로 가득 차 있다.

0개의 댓글