출처 : SW Expert Academy
버스는 0번에서 출발해 종점인 N번 정류장까지 이동하고, 한번 충전으로 최대한 이동할 수 있는 정류장 수 K가 정해져 있다.
충전기가 설치된 M개의 정류장 번호가 주어질 때, 최소한 몇 번의 충전을 해야 종점에 도착할 수 있는지 출력하는 프로그램을 만드시오.
[입력]
K:이동할 수 있는 최대 정류장 수 N:종점 M:총 충전소 수
[출력]
#과 노선번호, 빈칸에 이어 최소 충전횟수 또는 0을 출력한다.
# pass 성공
import sys
sys.stdin = open('input.txt')
T = int(input())
for tc in range(1, T+1):
#K:이동할 수 있는 최대 정류장 수 N:종점 M:총 충전소 수
K, N, M = map(int, input().split())
charge_spot = list(map(int, input().split()))
now = 0
cnt = 0
# temp + k > N 넘으면 break
while now + K < N:
for i in range(K, 0, -1):
# 이동할 정류장이 충전소인가?
if (now + i) in charge_spot:
# 충전소라면 현재위치를 이동 / 충전횟수 +1
now += i
cnt += 1
break
# 이동할 정류장이 충전소가 아니면 -1씩 되돌아가서 확인
else: # 이동할 정류장이 모두 충전소가 아니면 잘못된 케이스
cnt = 0
break
print("#{} {}".format(tc, cnt))
주석 참고
while now + K < N:
temp = now + K # temp에 이동 먼저 해놓고 밑에 테스트
for i in range(1, K):
# 이동한 정류장이 충전정류장리스트에 있는가?
if temp in charge_spot:
# 있다면 현재위치로 확정 / 충전횟수 +1
now = temp
cnt += 1
break
# 충전 안되는 위치라면 없으면 temp-1(K번 반복) 다시 확인
else:
temp -= 1
else:
cnt = 0
break
위의 코드에서는 i의 숫자를 사용하지 않으므로 횟수가 중요하다.
시작이 어떻게 되도 횟수가 K번이야 빠진 정류장 없이 확인 가능하다.