• [코테 연습] 단어 변환 Python

    2020. 6. 18. 20:27

    by. 위지원

    오늘도 뜬뜬 위젼은 뜬뜬 코테 연습을 한다네~

    오늘은 오후 내내 인공지능 공부를 쫌 했더니 뿌듯한 하루다 ^>^!

     

    https://weejw.tistory.com/377

     

    [코테 연습] 네트워크 Python

    처음엔 아래와 같이 작성했다. 방문한 노드는 그래프상에서 지워버리고 재귀가 끝났다면 한 네트워크가 생성된 것이니까 +1 테스트 케이스를 무려 9개나 돌렸다 .... def cal(dic, idx, invited): value = di

    weejw.tistory.com

     

    저번에 dfs 실패했을 때, 다른 분 블로그에서 본 코드를 공부해서 참고해서 풀었다. 행운의 분~~!! 이 분덕분에 오늘 문제는 무려 30분도 안되서 코드가 작성이 되긴 했다! 

     

    문제 설명

    두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.

    1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다. 2. words에 있는 단어로만 변환할 수 있습니다.

    예를 들어 begin이 hit, target가 cog, words가 [hot,dot,dog,lot,log,cog]라면 hit -> hot -> dot -> dog -> cog와 같이 4단계를 거쳐 변환할 수 있습니다.

    두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.

    제한사항

    • 각 단어는 알파벳 소문자로만 이루어져 있습니다.
    • 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
    • words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
    • begin과 target은 같지 않습니다.
    • 변환할 수 없는 경우에는 0를 return 합니다.

    첫 번째 시도 

    minStep = 50
    
    def dfs(currentWord, words, step, target):
        if currentWord != target:
            wordArr = copy.deepcopy(words)
            wordArr.remove(currentWord)
            step += 1
            for word in wordArr:
                if len(set(currentWord) - set(word)) == 1:
    
                    dfs(word, wordArr, step, target)
    
        if currentWord == target:
            global minStep
            minStep = min(minStep, step)
    
    def solution(begin, target, words):
        if target not in words:
            return 0
    
        for word in words:
            if len(set(begin) - set(word)) == 1:
                dfs(word, words, 1, target)
    
        return minStep
    테스트 1 통과 (0.04ms, 10.9MB)
    테스트 2 통과 (2.93ms, 10.8MB)
    테스트 3 〉 실패 (1.58ms, 10.8MB)
    테스트 4 통과 (0.08ms, 10.7MB)
    테스트 5 통과 (0.04ms, 10.8MB)

    음,, 그래 그래도!!!!! 으이 ! 4개나 통과하고! 

     

    질문 게시판에서 나와 같은 상황이 발생하는 사람을 발견했다. 문제는 단어의 순서를 고려치 않은 코딩이였다. 그 분도 나랑 똑같이 set을 썼다 ㅋㅋㅋ 생각이 다 거기서 거기군,,

     

    그럼 순서를 고려해서 단어를 비교해야 한다.  

     

    그러면 인덱스를 넣어줘야하니까..

     

    import copy
    
    minStep = 50
    def dfs(currentWord, words, step, target):
        if currentWord != target:
            wordArr = copy.deepcopy(words)
            wordArr.remove(currentWord)
            step += 1
            for word in wordArr:
                compareWord = zip(currentWord, word)
    
                cnt = 0
                for twoWord in compareWord:
                    if twoWord[0] != twoWord[1]:
                        cnt += 1
                if cnt == 1:
                    dfs(word, wordArr, step, target)
    
        if currentWord == target:
            global minStep
            minStep = min(minStep, step)
    
    
    def solution(begin, target, words):
        if target not in words:
            return 0
    
        for word in words:
            compareWord = zip(begin, word)
    
            cnt = 0
            for twoWord in compareWord:
                if twoWord[0] != twoWord[1]:
                    cnt += 1
    
            if cnt == 1:
                dfs(word, words, 1, target)
    
        return minStep
    테스트 1 통과 (0.06ms, 10.8MB)
    테스트 2 통과 (0.18ms, 10.8MB)
    테스트 3 통과 (0.58ms, 10.9MB)
    테스트 4 통과 (0.05ms, 10.8MB)
    테스트 5 통과 (0.05ms, 10.8MB)

    네트워크를 거진 이틀 내내 풀어서 그런지 이건 30분만에 풀어서 기분 진짜 완전 좋고 막 파티해야하고 ㅠ

    파티한다 오늘 광광운다 ㅠ 다른사람들이 보면 뭘 저거가지고 그러겠냐겠다..,, 수치사 꿱 그래도 지원이 잘했어요~

     

    오늘밤 화려한 조명이 감싸는 파티 주인공 누구수깡!!!!!!