알고리즘/프로그래머스

[프로그래머스 | Lv2] 택배 배달과 수거하기 (Python) - 2023 KAKAO BLIND RECRUITMENT

sssbin 2023. 2. 28. 17:37

 

https://school.programmers.co.kr/learn/courses/30/lessons/150369

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

d_temp, p_temp 변수를 만들어주고 집을 끝에서부터 돌면서 택배를 배달/수거하는 대로 값을 증가시켰다.

두 변수가 cap보다 크다면 for문을 멈추고 n값을 갱신하여 다시 반복문을 돌도록 해주었다.

 

# 실패
# 프로그래머스 150369: 택배 배달과 수거하기 (2023 KAKAO BLIND RECRUITMENT)

def solution(cap, n, deliveries, pickups):
    answer = 0
    
    while n >= 1:
        d_temp = 0
        p_temp = 0
        answer += n * 2
        
        for i in range(n-1, -1, -1):
            d_temp += deliveries[i]
            p_temp += pickups[i]

            if d_temp > cap:
                deliveries[i] = d_temp - cap
                n = i + 1
                break
            if p_temp > cap:
                pickups[i] = p_temp - cap
                n = i + 1
                break
        else:
            return answer
                
    return answer

 

테스트케이스는 다 맞았는데, 채점 결과는 10점이었다 (..ㅋ)

맨 마지막 집에 배달/수거할 택배가 없다면 틀린 알고리즘이라는 걸 깨닫고,

해당 조건일 때 n값을 감소시키는 부분을 추가했다.

 

# 실패
# 프로그래머스 150369: 택배 배달과 수거하기 (2023 KAKAO BLIND RECRUITMENT)

def solution(cap, n, deliveries, pickups):
    answer = 0

    while deliveries[n-1] == 0 and pickups[n-1] == 0:
        n -= 1
    
    while n >= 1:
        d_temp = 0
        p_temp = 0
        answer += n * 2
        
        for i in range(n-1, -1, -1):
            d_temp += deliveries[i]
            p_temp += pickups[i]

            if d_temp > cap:
                deliveries[i] = d_temp - cap
                n = i + 1
                break
            if p_temp > cap:
                pickups[i] = p_temp - cap
                n = i + 1
                break
        else:
            return answer
                
    return answer

 

그리고 런타임 에러가 떴다. ㅎㅎ;;

 

그래서 질문하기 게시판을 보고,,, 똑똑한 알고리즘을 찾았다.

맨 마지막 집에서부터 시작해서 해당 집에 방문할 때

모든 택배가 배달/수거될 때까지 while문을 돌려 반복문을 돌린 횟수를 계산하여 해당 값을 곱해준다.

이렇게 하면 마지막 집에 택배가 없을 때의 케이스도 잡아낼 수 있다.

 

 

# 프로그래머스 150369: 택배 배달과 수거하기 (2023 KAKAO BLIND RECRUITMENT)

def solution(cap, n, deliveries, pickups):
    answer = 0
    d_temp = 0
    p_temp = 0

    for i in range(n-1, -1, -1):
        cnt = 0
        d_temp += deliveries[i]
        p_temp += pickups[i]

        while d_temp > 0 or p_temp > 0:
            d_temp -= cap
            p_temp -= cap
            cnt += 1

        answer += cnt * (i+1) * 2
                
    return answer

 

👇 내가 썼던 테스트케이스

print(solution(4, 5, [1, 0, 3, 1, 2], [0, 3, 0, 4, 0])) # 16
print(solution(2, 7, [1, 0, 2, 0, 1, 0, 2], [0, 2, 0, 1, 0, 2, 0])) # 30
print(solution(2, 2, [0,0], [0,4])) # 8
print(solution(2, 2, [1,0], [1,0])) # 2