반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/150369
문제 풀이 힌트
- 단순 구현 문제다.
- 좀 생각할게 있을수록 쪼개서 생각해야 한다.
- 조건부터 나열하자.
01. 뒤에서부터 세야 한다.
02. deliver 배열이랑 pickup 배열을 계속 비교해줘야 한다.
=> 뒤에서부터 비교한 값에서(값이 0이 아닐 때) 더 큰 값을 가진 idx에다가 *2를 해서 answer에다가 더해줘야 한다.
03. 해당 배열의 값이 cap보다 수가 작을때, 크거나 같을 때
정답 풀이 코드
function solution(cap, n, deliveries, pickups) {
let answer = 0;
let deliverSum = deliveries.reduce((a,b) => a+b);
let pickupSum = pickups.reduce((a,b) => a+b);
// 모든 배달 및 수거가 완료될 때까지 반복
while(deliverSum !== 0 || pickupSum !== 0){
// 배열에서 0을 제거
deleteZero(deliveries);
deleteZero(pickups);
// 현재 상태에서의 최대 집 수 계산
let len = Math.max(deliveries.length, pickups.length);
// 이동 거리 계산 및 누적
answer += (len * 2);
// 상자 배달 및 수거 수행
deliverSum -= delItem(deliveries, cap);
pickupSum -= delItem(pickups, cap);
}
return answer;
}
// 배열에서 0을 제거하는 함수
function deleteZero(arr){
for(let i=arr.length-1; i>=0; i--){
if(arr[i] === 0) arr.pop();
else return;
}
}
// 상자를 배달하고 수거하는 함수
function delItem(arr, cap){
let cnt = 0;
for(let i=arr.length-1; i>=0; i--){
if(arr[i] >= cap){
// 상자가 가득 찼을 경우
arr[i] -= cap;
cnt += cap;
break;
}else{
// 상자가 부족할 경우
cap -= arr[i];
cnt += arr[i];
arr[i] = 0;
}
}
return cnt;
}
Only문제 풀이 코드
function solution(cap, n, deliveries, pickups) {
let answer = 0;
let deliverSum = deliveries.reduce((a,b) => a+b);
let pickupSum = pickups.reduce((a,b) => a+b);
while(deliverSum !== 0 || pickupSum !== 0){
deleteZero(deliveries);
deleteZero(pickups);
let len = Math.max(deliveries.length, pickups.length);
answer += (len*2);
deliverSum -= delItem(deliveries, cap);
pickupSum -= delItem(pickups, cap);
}
return answer;
}
function deleteZero(arr){
for(let i=arr.length-1; i>=0; i--){
if(arr[i] === 0) arr.pop();
else return;
}
}
function delItem(arr, cap){
let cnt = 0;
for(let i=arr.length-1; i>=0; i--){
if(arr[i] >= cap){
arr[i] -= cap;
cnt += cap;
break;
}else{
cap -= arr[i];
cnt += arr[i];
arr[i] = 0;
}
}
return cnt;
}
내가 풀려다가 만 틀린 풀이 코드)
function solution(cap, n, deliveries, pickups) {
//투포인터 활용
//끝에 idx부터 시작을 한다. 값이 0이면 이전 idx로 이동바로 해놓는다.
//cap 만큼 숫자를 빼준다.
//de 포인터랑 pick 포인터를 비교해서 더 먼 idx 로의 거리까지 *2 를 답으로 계속 저장해놓는다.
let answer = 0;
let deliverIdx = n-1;
let pickIdx = n-1;
while(deliverIdx >=0 || pickIdx >=0){
if(deliveries[deliverIdx] === 0){
deliverIdx--;
}
if(pickups[pickIdx] === 0){
pickIdx--;
}
if(deliveries[deliverIdx] !== 0 && pickups[pickIdx] !== 0){
let maxIdx = Math.max(deliverIdx, pickIdx);
answer += ((maxIdx + 1) * 2);
}
}
return answer;
}
function versus(idx, cap){
let temp = 0;
if(idx === 'deliverIdx'){
if(deliveries[idx] > cap){
deliveries[idx] = deliveries[idx]-cap;
}else if(deliveries[idx] < cap){
deliveries[idx] = 0
temp = cap - deliveries[idx];
}else{
deliveries[idx] = 0;
}
}else{
if(pickups[idx] > cap){
pickups[idx] = pickups[idx]-cap;
}else if(pickups[idx] < cap){
pickups[idx] = 0
temp = cap - pickups[idx];
}else{
pickups[idx] = 0;
}
}
return temp;
}
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: 두 큐 합 같게 만들기 - javascript(시간복잡도 고려하는 구현문제) (1) | 2024.03.18 |
---|---|
백준 1912: 연속합 - javascript(dp) (0) | 2024.03.17 |
백준 2529: 부등호 - javascript(완전탐색/dfs) (0) | 2024.03.16 |
프로그래머스 : 개인정보 수집 유효기간 - javascript(구현) (0) | 2024.03.14 |
백준 16236: 아기 상어 - javascript(bfs) (2) | 2024.03.14 |