본문 바로가기

알고리즘

[파이썬 | SW Expert Academy] 전기버스

[문제]

 

충전지를 교환하는 방식의 전기버스를 운행하려고 한다. 정류장에는 교체용 충전지가 있는 교환기가 있고, 충전지마다 최대로 운행할 수 있는 정류장 수가 정해져 있다.

충전지가 방전되기 전에 교체하며 운행해야 하는데 교체하는 시간을 줄이려면 최소한의 교체 횟수로 목적지에 도착해야 한다.

정류장과 충전지에 대한 정보가 주어질 때, 목적지에 도착하는데 필요한 최소한의 교환횟수를 출력하는 프로그램을 만드시오. 단, 출발지에서의 배터리 장착은 교환횟수에서 제외한다.

다음은 1번에서 출발 5번이 종점인 경우의 예이다.

정류장

1

2

3

4

5

충전지

2

3

1

1

 



1번에서 장착한 충전지 용량이 2이므로, 3번 정류장까지 운행할 수 있다. 그러나 2번에서 미리 교체하면 종점까지 갈 수 있다.

마지막 정류장에는 배터리가 없다.


[입력]

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 한 줄에 정류장 수 N, N-1개의 정류장 별 배터리 용량 Mi가 주어진다. 3<=N<=100, 0 < Mi < N


[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다

 

[풀이]

 

알고리즘 분류 : 백트래킹

배터리를 교체하는 경우와 배터리를 교체 안하는 경우로 분화해서 탐색해 나간다.

 

문제의 답이 최소 교체 경우를 찾는 것이므로, 최소 교체 경우를 점점 줄여나가면서 return하는 조건도 점점 까다롭게(ans값 보다 교체를 많이하면 바로 return) 하면 시간 초과를 피할 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# SWEA 전기버스2
 
def solve(num, charge, cnt):
    global ans
 
    if cnt > ans:    #####없으면 시간초과#####
        return
 
    if num == N:
        if ans > cnt:
            ans = cnt
        return
    #print(num, charge, cnt)
    
    # 지금 충전량이 배터리[정류장번호]보다 작으면 바꿔도 되고 안바꿔도 된다.
    if charge < battery[num] and charge > 0:
        solve(num+1, battery[num]-1, cnt+1)
        solve(num+1, charge-1, cnt)
 
    # 충전량이 0이면 무조건 바꾼다
    elif charge == 0:
        solve(num+1, battery[num]-1, cnt+1)
 
    # 지금 충전량이 배터리[정류장번호]보다 크거나 같으면 바꿀 이유가없다.
    elif charge >= battery[num]:
        solve(num+1, charge-1, cnt)
 
= int(input())
 
for t in range(1, T+1):
    ans = 999999
    battery = list(map(int, input().split()))
    N = battery[0]
    solve(2, battery[1]-10)
    print("#%d %d" %(t, ans))
cs