공부/알고리즘

[카카오 2023 코딩테스트] 택배 배달과 수거하기_java

Dr.thousand 2023. 10. 31. 08:59
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 해결방법 찾기


해당 문제는 결국 가장 먼 곳 부터 배달 및 수거가 완료되는것이 낫다고 판단한다.(그리디 알고리즘)
이유는 가장 비효율적인것이 물류창고에서 가장 먼 곳을 가게되는것이라고 보이기 때문이다.

그리고 여기서 감안해야 하는 부분이 기사는 도착지를 여러번 방문할 수 있다는 점이다. 그말은 즉슨 굳이 한번에 배달, 수거를 할 필요가없고 여러번 방문해도 된다는 점이다.

 

 

2. 코드 구현하기


class Solution {
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        
        for(int i=n-1; i>=0; i--){
            int d=deliveries[i];
            int p=pickups[i];
            
            int cnt=0;
            while(d>0 || p>0){
                d-=cap;
                p-=cap;
                cnt++;
            }
            if(i > 0){
                if(d < 0) deliveries[i-1]+=d;
                if(p < 0) pickups[i-1]+=p;
            }

            
            deliveries[i]=d;
            pickups[i]=p;
            
            answer+=cnt*2*(i+1);
        }
        
        return answer;
    }
}

위 코드의 해석은 방문지점만큼 반복문을 돌린다.
해당 지점에서 배달,수거를 최소 몇번해야하는지 찾는다. (cnt변수)
반복을 했을때 배달 ,수거를 할 때 해당지점에서 해도 공간이남는다면(cap) 해당 지점의 전의 구역도 남는공간만큼 배달,수거를 해준다(if(d < 0) deliveries[i-1]+=d; if(p < 0) pickups[i-1]+=p;) 그렇게되면 최소 해당지점을 몇번반복해야하는지 알수있다.

 

 

3. 후기



알고리즘을 공부하고있지만, 공부한 내용을 어떻게 유추하고 코딩에 접목시키는지는 다른것같다. 여러번 연습하면서 어떤 상황에 어떤 알고리즘을 사용해야하는지 연구할 필요가 있는것같다.

728x90
반응형