알고리즘

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

2023. 3. 10. 05:38
목차
  1. 🎨 문제
  2. 📘 풀이
  3. 📗 코드

🎨 문제

 

프로그래머스

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

programmers.co.kr

📘 풀이

이 문제는 그리디로 문제를 해결할 수 있습니다. 가장 멀리 있는 배달을 갔을 때 가장 멀리 있는 택배 상자를 수거하면 됩니다. 즉, 다음과 같은 전략으로 문제를 해결할 수 있습니다.

 

1. 배달 및 수거할 택배 상자가 남은 가장 먼 집부터 택배를 배달 및 수거합니다.

2. 트럭이 물류창고에서 출발해 가장 먼 집으로 이동할 때는 배달만 하고, 다시 물류창고로 돌아올 때는 수거만 합니다.

3. 트럭이 물류창고에서 출발할 때 항상 택배를 최대 개수만큼 배달하고, 물류창고로 돌아갈 때 최대 개수만큼 수거합니다.

 

스택을 활용하면 편하게 구현할 수 있습니다. 배달 및 수거할 택배 상자의 위치와 그 개수만큼 순서대로 스택에 넣습니다.

 

Stack<Integer> dStack = new Stack<>();
Stack<Integer> pStack = new Stack<>();

for (int i = 0; i < n; i++) {
    for (int j = 0; j < deliveries[i]; j++) {
        dStack.push(i + 1);
    }
    for (int j = 0; j < pickups[i]; j++) {
        pStack.push(i + 1);
    }
}

 

가장 멀리 떨어진 배달 및 수거해야 할 집을 구하고 한쪽 스택이 빌 때까지 뒤에서부터 cap 개수만큼 배달 및 수거를합니다. 이때 배달 및 수거를 한 거리는 왕복 거리이므로 가장 먼 집에서 곱하기 2를 해줍니다.

 

while (!dStack.isEmpty() && !pStack.isEmpty()) {
    int lastD = dStack.peek();
    int lastP = pStack.peek();

    for (int i = 0; i < cap; i++) {
        if (!dStack.isEmpty()) dStack.pop();
        if (!pStack.isEmpty()) pStack.pop();
    }

    answer += Math.max(lastD, lastP) * 2L;
}

 

마지막으로 남은 배달 혹은 수거를 합니다.

 

while (!dStack.isEmpty()) {
    int last = dStack.peek();

    for (int i = 0; i < cap; i++) {
        if (!dStack.isEmpty()) dStack.pop();
    }

    answer += last * 2L;
}

while (!pStack.isEmpty()) {
    int last = pStack.peek();

    for (int i = 0; i < cap; i++) {
        if (!pStack.isEmpty()) pStack.pop();
    }

    answer += last * 2L;
}

📗 코드

import java.util.Stack;

public class Solution {

    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        Stack<Integer> dStack = new Stack<>();
        Stack<Integer> pStack = new Stack<>();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < deliveries[i]; j++) {
                dStack.push(i + 1);
            }
            for (int j = 0; j < pickups[i]; j++) {
                pStack.push(i + 1);
            }
        }

        while (!dStack.isEmpty() && !pStack.isEmpty()) {
            int lastD = dStack.peek();
            int lastP = pStack.peek();

            for (int i = 0; i < cap; i++) {
                if (!dStack.isEmpty()) dStack.pop();
                if (!pStack.isEmpty()) pStack.pop();
            }

            answer += Math.max(lastD, lastP) * 2L;
        }

        while (!dStack.isEmpty()) {
            int last = dStack.peek();

            for (int i = 0; i < cap; i++) {
                if (!dStack.isEmpty()) dStack.pop();
            }

            answer += last * 2L;
        }

        while (!pStack.isEmpty()) {
            int last = pStack.peek();

            for (int i = 0; i < cap; i++) {
                if (!pStack.isEmpty()) pStack.pop();
            }

            answer += last * 2L;
        }

        return answer;
    }
}

'알고리즘' 카테고리의 다른 글

[프로그래머스] 표현 가능한 이진트리 - JAVA  (0) 2023.03.12
[프로그래머스] 이모티콘 할인 행사 - JAVA  (2) 2023.03.10
[프로그래머스] 개인정보 수집 유효기간 - JAVA  (0) 2023.03.07
[BOJ] 앱 - 7579  (0) 2022.12.08
[BOJ] Dance Dance Revolution - 2342  (2) 2022.12.07
  1. 🎨 문제
  2. 📘 풀이
  3. 📗 코드
'알고리즘' 카테고리의 다른 글
  • [프로그래머스] 표현 가능한 이진트리 - JAVA
  • [프로그래머스] 이모티콘 할인 행사 - JAVA
  • [프로그래머스] 개인정보 수집 유효기간 - JAVA
  • [BOJ] 앱 - 7579
acisliver
acisliver
acisliver
와당탕탕 개발놀이터
acisliver
전체
오늘
어제
  • 분류 전체보기 (65)
    • 회고 (11)
    • Spring (3)
    • 알고리즘 (21)
    • Java (2)
    • DevOps (2)
    • Shell (2)
    • Nginx (1)
    • Database (22)
    • Project (1)

블로그 메뉴

  • 태그
  • 방명록
  • GitHub
  • Notion

공지사항

인기 글

태그

  • Spring
  • spring boot
  • 코딩테스트
  • 백준
  • FOSSLight
  • 프로그래머스
  • 풀 인덱스 스캔
  • 오픈소스
  • dp
  • binarySearch
  • FuntionalInterface
  • 이진탐색
  • 우아한테크코스
  • 알고리즘
  • mysql
  • 구름톤 트레이닝
  • Shell
  • Java
  • 풀 테이블 스캔
  • 인덱스
  • 카카오
  • Leetcode
  • Bash
  • 프리코스
  • 자바
  • DevOps
  • innodb
  • 풀스택
  • 이분탐색
  • 오픈소스 컨트리뷰톤

최근 댓글

최근 글

hELLO · Designed By 정상우.
acisliver
[프로그래머스] 택배 배달과 수거하기 - JAVA
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.