Showing

[SWEA][파이썬] 전기버스 본문

컴퓨터 공학, 전산학/알고리즘

[SWEA][파이썬] 전기버스

RabbitCode 2023. 12. 3. 14:32

https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDN86AAXw5UW6&subjectId=AWOVFCzaqeUDFAWg#

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

소요시간 : 30분 이상

어려웠던 점: 오답 테스트케이스 2개를 잡을 수 없어서 포기하려다가 기존에 배터리가 있는 정류장에서 다음 배터리 정류장까지 남은 step이 충분하면 바로 continue 했는데 다시 살펴보니 현재 step 소비하는 로직을 적용하지 않았던 것이 문제였으므로 rest_step -= 1 를 추가해서 통과

아쉬운 점: 케이스 별로 하드코딩을 한 셈이여서 코드라인을 줄이고 최적화할 수 있는 로직이 따로 있는지 궁금하였다.

 

테스트 케이스 2개 오답 풀이

# 테스트 케이스 2개 실패
#만약 충전기 설치가 잘못되어 종점에 도착할 수 없는 경우는 0
i = int(input())
for k in range(i):
    move_max, dest, battery_nums = map(int, input().split())
    battery_num = list(map(int, input().split()))
    battery_rnum = battery_num[::-1]
    rest_step = move_max
    answer = 0
    isFail = False
    for j in range(1, dest+1):
        if rest_step <= 0:
            isFail = True
            break
        if len(battery_rnum) == 0 and dest - j > rest_step:
            isFail = True
            break
        if battery_rnum and battery_rnum[-1] == j:
            # 다음 배터리 정류장까지 갈 수 있는 배터리가 충분하다면 충전하지 않아도 된다.
            battery_rnum.pop()
            if dest - j < rest_step:
                continue
            if len(battery_rnum) > 0 and battery_rnum[-1]-j < rest_step:
                continue
            rest_step = move_max
            answer += 1
            continue
        rest_step -= 1
    if not isFail and rest_step < 0:
        print(f'#{k+1} {answer}')
    else:
        print(f'#{k + 1} {0}')

 

 

all pass 풀이

# 테스트 케이스 만점
#만약 충전기 설치가 잘못되어 종점에 도착할 수 없는 경우는 0
i = int(input())
for k in range(i):
    move_max, dest, battery_nums = map(int, input().split())
    battery_num = list(map(int, input().split()))
    battery_rnum = battery_num[::-1]
    rest_step = move_max
    answer = 0
    isFail = False
    for j in range(1, dest+1):
        if rest_step <= 0:
            isFail = True
            break
        if len(battery_rnum) == 0 and dest - j > rest_step:
            isFail = True
            break
        if dest - j < rest_step:
            rest_step -= 1
            continue
        if battery_rnum and battery_rnum[-1] == j:
            # 다음 배터리 정류장까지 갈 수 있는 배터리가 충분하다면 충전하지 않아도 된다.
            battery_rnum.pop()
            if len(battery_rnum) > 0 and battery_rnum[-1]-j < rest_step:
                rest_step -= 1
                continue
            rest_step = move_max
            answer += 1
            continue
        rest_step -= 1
    if not isFail:
        print(f'#{k+1} {answer}')
    else:
        print(f'#{k + 1} {0}')

 

아래 코드도 통과가능하다고 하여서 분석해봐야 겠다.

for tc in range(1, int(input()) + 1):
    k, n, m = map(int, input().split())
    chargers = set(map(int, input().split()))
    bus = k                         # 먼저 k만큼 앞으로 이동시켜봅니다.
    cnt = 0

    while bus < n:                  # 목적지에 도착할 때까지
        for i in range(k):
            tmp = bus - i           # 한 칸씩 뒤로 이동시키며
            if tmp in chargers:     # 해당 범위에 충전소가 있다면
                cnt += 1            # 카운트하고
                bus = tmp           # 다음 버스 위치
                break
        else:                       # 범위 내에 충전소가 없다면
            cnt = 0                 # 목적지 도착 불가
            break

        bus += k                    # k만큼 앞으로 이동시키고 위 과정 반복

    print(f"#{tc} {cnt}")