Algorithm(CodeTree, Python)/Backtracking

[코드트리] 최소 점프 횟수 Python

kurooru 2023. 1. 31. 00:17
# n 입력
n = int(input())
# num_list 입력
num_list = list(map(int, input().split()))

# 함수들
# is_possible(curr_idxs)
def is_possible(curr_idxs):
    
    # 첫번째 안밟았으면
    if curr_idxs[0] != 0:
        # 실패
        return False

    # 중간에 끊겼는지 확인
    for i in range(len(curr_idxs) - 1):
        # 다음 인덱스로 이동할 수 없으면
        if curr_idxs[i] + num_list[curr_idxs[i]] < curr_idxs[i+1]:
            # 실패
            return False
    
    # 마지막 점프가 닿지 않으면
    if curr_idxs[-1] + num_list[curr_idxs[-1]] < n-1:
        # 실패
        return False

    # 이외에는 성공
    return True

# simulate(jumps, curr_idx)
def simulate(jumps, curr_idx):

    # 전역 변수 선언
    global min_jump

    # 종료조건
    if curr_idx == jumps + 1:
        # 가능하면
        if is_possible(idxs):
            # min_jump update
            min_jump = len(idxs)
        return
    
    for i in range(n-1):
        # 오름차순
        if curr_idx >= 2 and i <= idxs[-1]:
            continue
        else:
            idxs.append(i)
            simulate(jumps, curr_idx + 1)
            idxs.pop()

# 설계
# min_jump
import sys
min_jump = sys.maxsize

# 점프 가능 횟수
for i in range(n-1, 0, -1):
    # idxs
    idxs = []
    # simulate(i, 1)
    simulate(i, 1)

# 출력
# 한번도 가능한 경우가 없었으면
if min_jump == sys.maxsize:
    print(-1)
# 가능한 경우가 있었다면,
else:
    print(min_jump)