Algorithm/SW Expert Academy

[Python] 4831. 전기버스

느낌표 공장장 2021. 8. 10. 19:58

충전기가 있는 곳에서 다음 충전기까지의 거리와 연료랑을 검토하는 코드 

# 노선 T
t = int(input())

# 노선 t만큼 반복
for idx in range(1, t+1):
    # 정류장 수 k, 종점 n, 충전기 설치된 곳의 수 m
    k, n, m = map(int, input().split())
    # 충전기가 설치된 곳
    charger = list(map(int, input().split()))

    now = 0 # 현재 위치
    battery = k # 배터리 상태
    next_c = 1 # 다음 충전기 설치 된 곳의 idx
    answer = 0 # 최소 충전 횟수

    # 목표지점 전까지 반복
    # 목표지점에서는 배터리 0이어도 상관 X이므로
    while now < n-1:
        now += 1 # 위치 이동
        battery -= 1 # 배터리 감소

        # 만약 현재 지점이 충전기가 설치된 곳이라면
        if now in charger:
            # 다음 충전기까지 배터리가 부족하다면,
            # 또는 현재 충전기가 마지막인경우, 남은 거리가 남은 배터리보다 많다면 충전
            if charger[next_c]-now > battery or (next_c == m-1 and n-now > battery):
                battery = k
                answer += 1

            # 다음 충전기 설치된 곳의 idx 변경
            if next_c < m-1:
                next_c += 1

        # print('now=', now, 'battery=', battery, 'answer=', answer, 'next_c=', next_c)

        # 목표 도달하지 못했는데 배터리가 없는 경우 0 반환하고 중단.
        if not battery:
            answer = 0
            break

    print('#{} {}'.format(idx, answer))

위의 코드는 테스트케이스를 다 통과하지만 3 11 5 / 1 3 4 7 8 이 반례를 통과하지 못한다.

그래서 마지막 정류장을 반드시 표시해주어야한다.

근데 그럼 인덱스 에러가 나니까, try except문을 사용한다.

# 노선 T
t = int(input())

# 노선 t만큼 반복
for idx in range(1, t + 1):
    # 정류장 수 k, 종점 n, 충전기 설치된 곳의 수 m
    k, n, m = map(int, input().split())
    # 충전기가 설치된 곳
    charger = list(map(int, input().split()))

    now = 0  # 현재 위치
    battery = k  # 배터리 상태
    next_c = 0  # 다음 충전기 설치 된 곳의 idx
    answer = 0  # 최소 충전 횟수

    # 목표지점 전까지 반복
    # 목표지점에서는 배터리 0이어도 상관 X이므로
    while now < n - 1:
        now += 1  # 위치 이동
        battery -= 1  # 배터리 감소

        # 만약 현재 지점이 충전기가 설치된 곳이라면
        if now in charger:

            # 다음 충전기 설치된 곳의 idx 변경
            if next_c != m:
                next_c += 1

            # 다음 충전기까지 배터리가 부족하다면,
            try:
                if charger[next_c] - now > battery:
                    battery = k
                    answer += 1

            # 또는 현재 충전기가 마지막인경우, 남은 거리가 남은 배터리보다 많다면 충전
            except:
                if next_c == m  and n - now > battery:
                    battery = k
                    answer += 1


        # print('now=', now, 'battery=', battery, 'answer=', answer, 'next_c=', next_c)

        # 목표 도달하지 못했는데 배터리가 없는 경우 0 반환하고 중단.
        if not battery:
            answer = 0
            break

 

* 다른 팀원의 코드 - 기름이 다 닳은 시점에서 그 전에 충전기가 있었는지 검사

n = int(input())

for k in range(1, n+1):
    # K = 한번충전으로 이동가능한 정류장수 , N = 종점, M = 충정기정류장 수
    K, N, M = map(int, input().split())
    charge_idx = list(map(int, input().split()))

    charge = [0 for i in range(N+1)] # 종점까지 충전소 세팅하기  0없음, 1있음
    for i in charge_idx:
        charge[i] = 1

    cnt = 0
    fuel = K + 1  # for문 처음 시작할때 -1 하므로
    for i in range(N + 1): # 버스 출발!
        if i == N:   # 도착하면 끝 아무것도 하지마
            break
        fuel -= 1
        # print(fuel)
        if fuel == 0: # 기름이 다닳은 시점에서 그전 K안에 정류장이 있었나 검사.
            temp =0 # 다 닳은 시점에서 몇정거장 전에 충전소 있었는지
            for j in range(i, i-(K+1), -1):
                if temp == K:
                    cnt = 0
                    break
                if charge[j] == 1:
                    fuel = K - temp # 현위치에서 남은 연료량
                    cnt += 1  # 충전횟수 + 1
                    break
                else:
                    temp += 1  # for문 돌면서

    print('#{} {}'.format(k, cnt))

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 1209. sum  (0) 2021.08.11
[Python] 1208. Flatten  (0) 2021.08.11
[Python] 4835. 구간합  (0) 2021.08.10
[Python] 4834. 숫자 카드  (0) 2021.08.10
[Python] 4828. min max  (0) 2021.08.10