본문 바로가기
프로그래머스/Python

[프로그래머스] 단어 변환 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 8. 15.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

각 단어를 변경할 단어와 비교하여 일치하는 문자의 개수를 구해 딕셔너리로 저장한 뒤, 변경할 단어와 1글자만 달라야 해당 단어로 변경할 수 있기 때문에 변경 가능한 단어를 리스트에 따로 저장한다.

저장한 리스트가 비어있다면 변환 불가능한 경우이고 리스트가 비어있지 않다면 목표 단어가 있는지 찾는다.

목표 단어가 있다면 목표로 단어로 변경하고 없다면 아무 단어로 변경한다.

변경할 단어가 목표 단어이면 종료한다.

 

  1. 만약 목표 단어가 단어 집합에 없다면 if (target not in words)
  2. 변환할 수 없는 경우이므로 바로 종료한다. return answer
  3. 변경할 단어가 목표 단어일 때까지 반복한다. while (begin != target)
  4. 단어 집합에 있는 단어와 변경할 단어의 일치하는 문자 개수를 저장할 딕셔너리를 생성한다. d = {}
  5. 단어 집합에 있는 단어를 하나씩 추출해 for i in words
  6. 추출한 단어를 key로 하여 value를 초기화한다. d[i] = 0
  7. 변경할 단어의 길이만큼 반복하며 for j in range(len(begin))
  8. 만약 추출한 단어와 변경할 단어의 각 자리 문자가 일치하면 if (begin[j] == i[j])
  9. 해당 단어의 value 값을 1 증가시킨다. d[i] += 1
  10. 단어 집합의 모든 단어와 비교했다면 변경할 단어와 1글자만 다른 단어를 저장할 리스트를 생성한다. li = list()
  11. 딕셔너리의 key와 value를 튜플로 변환한 결과를 하나씩 추출하여 for i in d.items()
  12. 만약 일치하는 단어의 개수가 변경할 단어와 1글자 차이라면 if (i[1] == len(begin) - 1)
  13. 해당 단어를 리스트에 추가한다. li.append(i[0])
  14. 딕셔너리의 모든 단어와 비교한 뒤, 만약 변경 가능한 단어 리스트에 원소가 없다면 if (len(li) == 0)
  15. 목표 단어로 변환할 수 없는 경우이므로 0을 반환한다. return 0
  16. 그게 아니라면 변경 가능한 단어 리스트에 목표 단어가 있는지 확인하고 있다면 if (target in li)
  17. 변경할 단어를 목표 단어로 변경한다. begin = target
  18. 반면에 목표 단어가 없다면 else
  19. 변경 가능한 단어 리스트에서 아무 단어(그냥 제일 앞에 있는 단어)로 변경한다. begin = li[0]
  20. 한 번 변경한 단어는 다시 변경될 수 없도록 단어 집합에서 제거한다. words.remove(begin)
  21. 한 번 단어를 변경했으므로 변경한 횟수를 1 증가시킨다. answer += 1
반응형

3. 소스코드

def solution(begin, target, words):
    answer = 0
    
    if (target not in words):
        return answer
    
    while (begin != target):
        d = {}
        for i in words:
            d[i] = 0
            for j in range(len(begin)):
                if (begin[j] == i[j]):
                    d[i] += 1
        
        li = list()
        for i in d.items():
            if (i[1] == len(begin) - 1):
                li.append(i[0])

        if (len(li) == 0):
            return 0
        
        if (target in li):
            begin = target
        else:
            begin = li[0]

        words.remove(begin)
        answer += 1
    
    return answer
728x90
반응형