RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[프로그래머스>Lv2] 택배 배달과 수거하기 - Python

2023. 2. 3. 00:33
728x90
반응형
 

프로그래머스

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

programmers.co.kr

 

1. 문제

트럭 하나로 모든 배달과 수거를 마치고 물류창고까지 돌아올 수 있는 최소 이동 거리를 구하려 합니다.

각 집에 배달 및 수거할 때, 원하는 개수만큼 택배를 배달 및 수거할 수 있습니다.

 

[입력]

  1. cap: 트럭에 실을 수 있는 재활용 택배 상자의 최대 개수
  2. n: 배달할 집의 개수
  3. deliveries: 각 집에 배달할 재활용 택배 상자의 개수
  4. pickups: 각 집에서 수거할 빈 재활용 택배 상자의 개수

 

[출력]

트럭 하나로 모든 배달과 수러를 마치고 물류 창고까지 돌아올 수 있는 최소 이동 거리를 return

 

2. 풀이

어렵게 생각하지 않고 간단하게 생각해보면 쉽게 풀 수 있는 문제였습니다.ㅎㅎ 😭

가장 먼 집에서 부터 시작해, 배달할 수 있을만큼 전부 배달하고 픽업할 수 있을만큼 전부 픽업해오면 됩니다.

 

👇🏻 요렇게

 

이를 코드로 구현하면 아래와 같습니다.

# 실을 수 있는 수
delivable = cap

while deliver >= 0:
	# 모든 택배를 배달할 수 있는 경우
    if delivable - deliveries[deliver] >= 0:
    	delivable -= deliveries[deliver]
        deliver -= 1
    # 일 부분만 배달할 수 있는 경우
    else:
    	# 일부분의 택배만 배달
        deliveries[deliver] -= deliverable​

 

이는 택배를 회수할 때도 동일합니다. 🤗👍🏻

트럭이 한 번 이동할 때 택배를 배달하는 동작과 회수하는 동작을 함께 수행하게 됩니다.

그렇다면 택배를 배달해야 하는 가장 먼 집과 택배를 회수해야 하는 가장 먼 집 중 더 먼 거리가 해당 회차 때 실질적으로 이동해야 하는 거리임을 알 수 있습니다.

위와 같은 상황일 경우, 실질적으로 이동해야 하는 거리는 더 멀리 이동해야 하는 5입니다.

 

3. 코드

def solution(cap, n, deliveries, pickups):
    answer = 0
    
    # 뒤에서 부터 탐색
    deliver, pickup = n-1, n-1
    
    while deliver >= 0 and deliveries[deliver] == 0: deliver-=1
    while pickup >= 0 and pickups[pickup] == 0: pickup-=1
    
    while deliver >= 0 or pickup >= 0:
        answer += (max(deliver, pickup)+1) * 2
        delivable, pickable = cap, cap
        
        while deliver >= 0:
            if delivable - deliveries[deliver] >= 0:
                delivable -= deliveries[deliver]
                deliver -= 1
            else:
                deliveries[deliver] -= delivable
                break
            
        while pickup >= 0:
            if pickable - pickups[pickup] >= 0:
                pickable -= pickups[pickup]
                pickup -= 1
            else:
                pickups[pickup] -= pickable
                break
        
    return answer

 

 

 

 

반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스>Lv1] 둘만의 암호 - kotlin & python  (0) 2023.02.03
[프로그래머스>Lv2] 뒤에 있는 큰 수 찾기 - Kotlin  (0) 2023.02.03
[프로그래머스>Lv.2] 무인도 여행  (0) 2023.01.31
[Lv.2] 이모티콘 할인행사  (0) 2023.01.27
[Lv.1] 개인정보 수집 유효기간 - python & Kotlin  (0) 2023.01.24
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스>Lv1] 둘만의 암호 - kotlin & python
    • [프로그래머스>Lv2] 뒤에 있는 큰 수 찾기 - Kotlin
    • [프로그래머스>Lv.2] 무인도 여행
    • [Lv.2] 이모티콘 할인행사
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바