-
[Programmers] 택배 배달과 수거하기 / ❌Algorithm/Programmers 2024. 10. 2. 19:30
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 제출코드 (1시간 10분 23초 / Stack)
import java.util.*; class Solution { public long solution(int cap, int n, int[] deliveries, int[] pickups) { long answer = 0; ArrayDeque<Integer> d = new ArrayDeque<>(); ArrayDeque<Integer> p = new ArrayDeque<>(); for(int i = 0; i < deliveries.length; i++) { d.add(deliveries[i]); } for(int i = 0; i < pickups.length; i++) { p.add(pickups[i]); } while(!d.isEmpty() || !p.isEmpty()) { int dist = 0; int stock = cap; while(!d.isEmpty()) { int t = d.pollLast(); if(t == 0) continue; if(stock >= t) { stock -= t; dist = Math.max(dist, d.size() + 1); } else if (stock < t) { t -= stock; d.add(t); dist = Math.max(dist, d.size()); break; } } int store = 0; while(!p.isEmpty()) { int t = p.pollLast(); if(t == 0) continue; if(store + t <= cap) { store += t; dist = Math.max(dist, p.size() + 1); } else if(store + t > cap){ t = store + t - cap; p.add(t); dist = Math.max(dist, p.size()); break; } } answer += dist * 2; } return answer; } }
2. 구현 로직
- 배달 Stack과 수거 Stack을 만들어 모든 집의 정보를 입력
- 2개의 스택이 모두 빌 때까지 반복
- 가장 먼 집에서부터 하나씩 배달을 진행하고 dist를 지속적으로 갱신(모든 상자를 배달할 때까지 반복)
- 가장 먼 집에서부터 하나씩 수거를 진행하고 dist를 지속적으로 갱신(상자가 Cap만큼 찰 때까지 반복)
- 왕복이므로 dist*2를 하여 answer에 더하기
3. 유의할 점
- 시간 복잡도를 계산하지 않았어서 배열을 그대로 활용했더니 16,17,18,19 케이스에서 시간초과가 터졌다.
- 이를 해결하기 못해서, 질문하기를 보니 Stack을 활용한다는 것을 보고 알고리즘을 다시 작성해서 풀 수 있었다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 테이블 해시 함수 / ⭕ (0) 2024.10.04 [Programmers] 연속 부분 수열 합의 개수 / ⭕ (0) 2024.10.03 [Programmers] 귤 고르기 / ⭕ (0) 2024.07.24 [Programmers] 마법의 엘리베이터 / ⭕ (1) 2024.07.23 [Programmers] 시소 짝꿍 / ❌ (0) 2024.07.21