4831. [파이썬 S/W 문제해결 기본] 1일차 - 전기버스

Sarah·2021년 8월 26일
0

SWE

목록 보기
4/19

출처 : 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))

풀이

주석 참고

장애물

  1. 테스트 케이스 10개 중 8개만 통과하는 코드
  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
  • for문에서 range를 (K)로 해야함...!! 이걸.. 놓쳤다.
    range(1, K ) -> 1,2
    range(K) -> 0,1,2

위의 코드에서는 i의 숫자를 사용하지 않으므로 횟수가 중요하다.
시작이 어떻게 되도 횟수가 K번이야 빠진 정류장 없이 확인 가능하다.

profile
2021.06 ~

0개의 댓글