알고리즘 문제 풀기

프로그래머스: 택배 배달과 수거하기- javascript(구현)

Fo_rdang 2024. 3. 16. 20:36
반응형

문제 출처 

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

 

프로그래머스

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

programmers.co.kr

문제 풀이 힌트 

- 단순 구현 문제다. 

- 좀 생각할게 있을수록 쪼개서 생각해야 한다. 

- 조건부터 나열하자. 

 

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; 
}
반응형