프로그래머스 완전탐색 문제인
[모음사전]을 파이썬으로 풀어보겠습니다!
고득점 키트의 완전탐색 유형에 있는 문제입니다.
Lv2로 난이도 하에 해당하기 때문에
접근방법만 떠올리면 어렵지 않게 풀 수 있습니다.
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는
길이 5 이하의 모든 단어가 수록되어 있습니다.
사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며
마지막 단어는 "UUUUU"입니다.
단어 하나 word가 매개변수로 주어질 때
이 단어가 사전에서 몇 번째 단어인지 return 하도록
solution 함수를 완성해주세요.
제한사항
1. word의 길이는 1 이상 5 이하입니다.
2. word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.
이 문제 전형적인 백트래킹 문제입니다.
이거 깊이 우선 탐색이라 DFS 아니야? 라는 생각이 들지만
사실 백트래킹을 포함한 형태의 DFS라고 하는게 정확합니다.
그렇다면 접근방법부터 떠올려보시죠
문제에서 주어진대로 일단 쭉 나열해봅시다.
A
AA
AAA
AAAA
AAAAA
AAAAE
AAAAI
AAAAO
AAAAU
AAAE
AAAEA
AAAEE
AAAEI
AAAEO
AAAEU
AAA
나열해보니 어떤 규칙성이 보이지 않나요?
저희는 총 다섯자리를 채울거에요.
A부터 가능한 전부 채워봅시다.
모든 자리의 수를 체크해야 되기 때문에
문자를 추가할 때마다 생성된 문자열을 전부 기록합니다.
가장 우선순위가 높은 A부터 쭉 채우다 보니 5자리를 꽉 채우게 되었네요!
이제부터는 다음 우선순위인 문자도 고려해볼까요?
가장 마지막 자리에 다음 우선순위인 E,I,O,U 를 차례대로 채워줍니다.
이제 더이상 채울 수 있는 경우가 없으니
자리수를 한칸 앞으로 당겨봅시다.
한자리수 앞으로 당겨 E를 추가해주니 가능한 경우의 수가 많이 생겼네요!
새로운 문자열 (AAAE)에 또다시 다섯개의 문자(A,E,I,O,U)를 채워봅시다.
동일한 방식으로 I,O,U 도 채워주면 벌써 많은 문자열이 생성됐어요.
이런식으로 쭉쭉 경우의 수를 고려하다보면
제가 원하는 문자열에서 Stop 해주면 되겠죠
이제 코드를 살펴볼까요?
def solution(word):
alpha_list = ["A","E","I","O","U"]
cnt = 0
def backtracking(ans):
nonlocal cnt
cnt += 1
# 내가 원하는 단어에 도달하면 재귀를 멈추고 cnt 리턴하기
if "".join(ans) == word:
return True
# 5자리까지 채웠다면 한단계 전으로 돌아가기 -> ans.pop()
if len(ans) == 5:
return False
for alpha in alpha_list:
ans.append(alpha)
if backtracking(ans):
return True
ans.pop()
for s in alpha_list:
if backtracking([s]):
return cnt
return 0
전형적인 백트래킹 템플릿입니다.
이 문제는 접근방법만 잘 파악했다면 기본템플릿으로도 풀 수 있는 쉬운 문제입니다.
(혹시 틀리거나 이해가 안가는 부분이 있으시다면 댓글 남겨주세요~😉)
'코딩테스트 > Python 코테 문제풀이' 카테고리의 다른 글
[Python] bisect를 사용하여 이진탐색을 해보자 (bisect_left, bisect_right) (1) | 2024.09.04 |
---|---|
[Python] 주사위 고르기 (카카오 2024 겨울 인턴십 코테) 문제 풀이 (3) | 2024.09.04 |
[Python] Network Delay Time (다익스트라) 문제 풀이 (0) | 2024.07.16 |
[Python 알고리즘] 다익스트라 구현하기 (0) | 2024.07.16 |