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)