import sys
from collections import deque
def func(k):
    if k == len(N):
        max_num = 0
        for i in range(len(arr)):
            max_num = max(max_num,int(arr[i]))
        
        if max_num == len(arr):
            for i in range(len(arr)):
                print(int(arr[i]), end = ' ')
            sys.exit()            
        return
    if k < len(N) and int(N[k]) <= 50 and not visit[int(N[k])]:
        visit[int(N[k])] = 1
        arr.append(N[k])
        func(k+1)
        arr.pop()
        visit[int(N[k])] = 0
    if k + 1 < len(N) and int(N[k:k+2]) <= 50 and not visit[int(N[k:k+2])]:
        visit[int(N[k:k+2])] = 1
        arr.append(N[k:k+2])
        func(k+2)
        visit[int(N[k:k+2])] = 0
        arr.pop()
    
arr = deque()
N = input()
visit = [0] * 51
func(0)
중간의 두 개의 if문이 백트래킹입니다.
숫자가 최대 50개이므로, 한 개 혹은 두 개씩 숫자를 잘라서 확인해야 합니다.
재귀를 호출하고 나서는 꼭 재귀를 호출하기 전 상태로 돌아가는 것이 백트래킹의 핵심입니다.
visit[] = 0으로 만들거나, pop()을 해 주는 이유입니다.
제일 먼저 나오는 if는 N의 끝까지 읽었을 때,
배열에서 가장 큰 값과 배열의 길이가 같다면 수열이 완성됐다고 판단하고 종료합니다.
| 백준 3055 - 탈출 Python (0) | 2020.11.05 | 
|---|---|
| 백준 1966 - 프린터 큐 Python (0) | 2020.11.04 | 
| 백준 14503 - 로봇 청소기 Python (0) | 2020.11.03 | 
| 백준 2606 - 바이러스 C++ (0) | 2019.11.25 | 
| 프로그래머스 Level 1 - 체육복(C++) (0) | 2019.11.24 |