IT

[레벨2] 모음사전

자비단 2023. 5. 5. 12:40
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/84512

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

주어진 단어가 사전에서 몇 번째인지 순서를 찾는 문제이다.

dfs를 이용하여 사전 전체를 완성한 후 word의 index를 찾는 방식으로 풀어보았다.

# dfs로 사전 전부 완성 후 단어를 사전에서 찾기

def solution(word):
    vowels = ["A","E","I","O","U"]
    answer = []
    
    def dfs(cnt, lst):
        answer.append("".join(lst[:]))
        if cnt == 5:
            return
        else:
            for v in vowels:
                lst.append(v)
                dfs(cnt+1, lst)
                lst.pop()
    dfs(0,[])
    return answer.index(word)

아래와 같이 한 번에 성공하였다!

이번 문제에서는 모음만 가정하여 단어의 최대 길이가 5자이다.

하지만 최대 길이가 더 길어질 경우, 사전을 다 완성한 후 index를 찾는 방법은 효율성이 떨어질 것이다.

그래서 사전을 완성해나가다가 word가 나오면 더 이상 사전을 완성하지 않고 멈추는 방식으로 코드를 수정해보았는데..

# dfs로 사전 전부 완성 전에 멈추기

def solution(word):
    vowels = ["A","E","I","O","U"]
    answer = []

    def dfs(cnt, lst):
        if word in answer:
            return
        else:
            answer.append("".join(lst[:]))
            if cnt == 5:
                return
            else:
                for v in vowels:
                    lst.append(v)
                    dfs(cnt+1, lst)
                    lst.pop()
    dfs(0,[])
    return len(answer)-1

이상하게 효율성이 더 안좋아졌다!!

특시 테스트4의 경우는 소요 시간이 100배가 되었다.

list 자료형의 in 연산은 O(n)이어서 오래 걸릴까 싶어, answer를 in 연산이 O(1)인 set 자료형 변경 후 다시 계산해보았다.

# dfs로 사전 전부 완성 전에 멈추기
# answer를 list 대신에 set으로 수정

def solution(word):
    vowels = ["A","E","I","O","U"]
    answer = set()

    def dfs(cnt, lst):
        if word in answer:
            return
        else:
            answer.add("".join(lst[:]))
            if cnt == 5:
                return
            else:
                for v in vowels:
                    lst.append(v)
                    dfs(cnt+1, lst)
                    lst.pop()
    dfs(0,[])
    return len(answer)-1

확실히 계산 속도가 개선되었다.

몇몇 케이스 (ex. 테스트 4 등)은 첫번째보다 느려졌으나, 최대 단어의 길이가 길어질수록 세번째 코드가 더 효율적일 것이라 기대된다.

반응형