220v
젝무의 개발새발
220v
전체 방문자
오늘
어제
  • 분류 전체보기 (255)
    • AI (35)
      • ML, DL 학습 (30)
      • 논문 리뷰 (4)
      • 실습 및 프로젝트 (1)
    • Algorithm (145)
      • LeetCode (13)
      • 프로그래머스 (35)
      • 백준 (96)
      • 알고리즘, 문법 정리 (1)
    • Mobile, Application (17)
      • Flutter (10)
      • iOS, MacOS (7)
    • BackEnd (7)
      • Flask (1)
      • Node.js (5)
      • Spring, JSP..etc (1)
    • Web - FrontEnd (18)
      • JavaScript, JQuery, HTML, C.. (12)
      • React (6)
    • DataBase (1)
      • MySQL (1)
      • Firebase Firestore (0)
      • Supabase (0)
    • Git (1)
    • 기타 툴 및 오류 해결 (3)
    • 강의 (5)
      • Database (3)
      • 암호학 (2)
      • 알고리즘 (0)
    • 후기와 회고 (2)
    • 블로그 꾸미기 (1)
    • 일상과 이것저것 (20)
      • 맛집 (12)
      • 세상사는일 (4)
      • 도서리뷰 (1)
      • 이런저런 생각들 (잡글) (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BFS
  • Backtracking
  • 위상 정렬
  • dp
  • IMPLEMENT
  • bitmasking
  • implementation
  • two pointer
  • Greedy
  • 티스토리챌린지
  • Dynamic Programming
  • REACT
  • 구현
  • top-down
  • topological sort
  • brute-Force
  • Priority Queue
  • 다익스트라
  • union-find
  • Lis
  • dfs
  • 백준
  • Minimum Spanning Tree
  • 프로그래머스
  • Prefix Sum
  • simulation
  • disjoint set
  • Mathematics
  • 오블완
  • binary search

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
220v

젝무의 개발새발

Algorithm/프로그래머스

[프로그래머스] 택배 배달과 수거하기 - 파이썬

2023. 4. 28. 01:42

2023 KAKAO BLIND RECRUITMENT - 150369. 택배 배달과 수거하기

[Lv. 2]

 

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

 

프로그래머스

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

programmers.co.kr

 

풀이

문제를 읽고 나서의 초견은, Greedy하게 접근하면 되지 않을까? 였다.

제일 먼 곳에서부터 배달/수거를 cap만큼 꽉꽉 채워서 왔다갔다 하는 식으로..

일단 구현해보자.

 

조금 유의하며 코드를 작성했던 부분은, deliveries나 pickups 배열에서 값이 존재하는(0이 아닌) 가장 큰 index를 찾을 때는, 그때마다 탐색하며 찾으면 O(n)이므로, 따로 index pointer를 선언하여 처리해 주었다.

index pointer로 처리하지 않고, while문의 조건식 등도 sum이나 max함수같은 O(n)인 함수를 사용하게 되면, 자연히 시간초과가 난다.

 

AC.

def solution(cap, n, deliveries, pickups):
    deliverPointer = n-1
    pickupPointer = n-1
    answer = 0

    while pickups[pickupPointer] != 0 or deliveries[deliverPointer] != 0:
        length = []
        # 제일 먼 집부터 배달을 처리해나감
        temp = 0
        for i in range(deliverPointer, -1, -1):
            if cap >= temp + deliveries[i]:
                temp += deliveries[i]
                deliveries[i] = 0
                deliverPointer -= 1
                length.append(i)
            else:
                # cap < temp + deliveries[i]
                deliveries[i] -= cap-temp
                temp = cap
                length.append(i)
                break

        # 그리고 갔다 오면서 수거도
        temp = 0
        for i in range(pickupPointer, -1, -1):
            if cap >= temp + pickups[i]:
                temp += pickups[i]
                pickups[i] = 0
                pickupPointer -= 1
                length.append(i)
            else:
                # cap < temp + pickups[i]
                pickups[i] -= cap-temp
                temp = cap
                length.append(i)
                break

        if length:
            answer += (max(length)+1)*2
            
    return answer

 

 

    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스] 미로 탈출 명령어 - 파이썬
    • [프로그래머스] 표현 가능한 이진트리 - 파이썬
    • [프로그래머스] 67260. 동굴 탐험
    • [프로그래머스] 67258. 보석 쇼핑
    220v
    220v
    DGU CSE 20 / Apple Developer Academy @ POSTECH 2nd Jr.Learner.

    티스토리툴바