본문 바로가기
코딩테스트

99클럽 코테 스터디 7일차 TIL : 프로그래머스 모음사전, 깊이우선탐색

by fecu 2024. 11. 4.
728x90

 

1. 오늘의 문제

 
오늘 문제는 딱 봐도 깊이우선탐색이다.
 
문자의 길이가 5인데 길이가 최대 5니까, 탐색해야 할 노드의 수는 5의 5승이다.
 
개수가 최대 3125이니까 별로 없음.
 
for문으로도 가능하겠다 싶었다.
 

더보기

문제 설명

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • word의 길이는 1 이상 5 이하입니다.
  • word 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

 

2. 야매 코드

 
일단 먼저 for문으로 풀어보았다.
 
중간에 return을 안하고 break를 했더니, for문 전체가 멈추는게 아니라 하나의 for문만 멈추면서 제대로된 값이 나오지 않았다.
 
뭐가 문제인지 한참을 헤메다가 찾았다.
 
이럴땐 AI의 도움을 받고싶은 마음이 굴뚝같다.
 

def solution(word):
    lst = ["A", "E", "I", "O", "U"]
    count = 0
    for i in lst:
        count += 1
        if i == word:
            return count
        # print(i)
        for j in lst:
            count += 1
            if i+j == word:
                return count
            # print(i+j)
            for k in lst:
                count +=1
                if i+j+k == word:
                    return count
                # print(i+j+k)
                for l in lst:
                    count += 1
                    if i+j+k+l == word:
                        return count
                    # print(i+j+k+l)
                    for m in lst:
                        count += 1
                        if word == i+j+k+l+m:
                            return count
                        # print(i+j+k+l+m)
    return count

 
이걸 재귀 함수로 구현하고 싶었는데 쉽지 않았다.
 
아래는 재귀함수이다.
 

3. 재귀 함수로 구현한 풀이

 
아래는 위의 for문을 재귀함수로 만들어 보았다.
 
재귀함수의 깊이가 최대 5이니, 그리 깊지 않아서 가능했다.
 
solution 내부의 count, find라는 변수를 내부 함수에서 어떻게 이용하는지 몰랐는데, AI가 nonlocal이라는 키워드를 알려주었다.
 
global만 맨날 썼는데, nonlocal은 처음 써 보았다.
 

def solution(word):

    lst = ["A", "E", "I", "O", "U"]
    count = 0
    find = False
    def dfs(t, depth) :
        nonlocal find
        nonlocal count
        depth += 1
        if depth>5:
            return
        for i in lst:
            if find :
                return
            count += 1
            if t+i == word:
                find = True
                return
            dfs(t+i, depth)
        
    dfs("", 0)
    return count

 
프로그래머스에서 재귀함수를 쓰는게 상당히 어려웠다.
 
백준이었으면 답을 찾고 바로 값을 프린트 후 exit로 파이썬을 종료해 버리면 되는데, 프로그래머스에서는 값을 리턴해야 했다.
 
그러면 어떻게든 재귀함수를 빠져나와야 하는데, 그 과정이 어려웠다.
 
그래서 find라는 변수를 두고, 값을 찾으면 find를 true로 변경시키면서 재귀함수 전체를 탈출하는 것으로 구현해 보았다.
 

4. 느낀점

 
30분 안에 끝내려던 것이 아기를 재우고 하다보니 두 시간이 훌쩍 넘었다.
 
매일매일 꾸준하게 뭔가를 한다는게 무척 어렵다.
 
그리고 다 구현할 줄 안다고 생각했던 깊이우선탐색과 재귀함수도 다른 형태로 만나니 색다르다.
 
또 해결해야 할 과제가 있고, 이걸 다 채우면 2만원을 돌려받을 수 있다는 생각을 하니 조금 더 힘이 나는 것 같다.
 
주말이 고비지만, 매일 과제를 해결해서 네이버 페이 2만원 받고 싶다.
 

728x90