주녘공부일지

[프로그래머스 C#] Lv.2 택배 배달과 수거하기 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 택배 배달과 수거하기

주녘 2023. 12. 25. 18:11
728x90

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

물류창고 -> 배달 -> 수거 -> 물류창고를 반복해 배달, 수거를 끝내는 최단 거리를 구하는 문제

- 배달이든, 수거든 최단거리로 이동하기 위해선 가장 멀리있는 곳을 먼저 가야 함 ( 동일 조건 )

- 배달과 수거는 동시에 이루어질 수 있기 때문에, 더 멀리 있는 곳을 기준으로 이동하면 됨

 -> 즉, 배달배열과 수거배열 중에 더 멀리 가야하는 곳을 기준으로 삼아 이동횟수 * 2

 

+ 0번 인덱스의 집에 가는 거리는 1이므로, 인덱스의 길이가 가장 먼 인덱스와의 거리가 됨

 

1) 끝을 지워나가며 체크하기 위해 리스트에 담음

 - 리스트의 길이가 배달을 해야하는 거리가 됨

 

2) 두 리스트에 대해 같은 동작을 할 것이기 때문에 메서드를 따로 선언 ( Function )

 - 리스트의 마지막 인덱스가 0이 아닐때까지 끝을 지워나감

 - 리스트의 마지막 인덱스부터 0이 될때까지 빼나감 ( cap 값 만큼 )

 

3) 한 사이클의 왕복 거리 측정 ( 한 사이클 : 물류창고 -> 배달 -> 수거 -> 물류창고 )

- 함수에서는 배달, 수거를 하기 전에 마지막 인덱스를 지우기 때문에 list의 길이는 배달을 해야하는 거리가 됨

 

주석 참조

using System;
using System.Collections.Generic;

public class Solution
{
    public long solution(int cap, int n, int[] deliveries, int[] pickups)
    {
        long answer = 0;
        
        // 1) 끝을 지워나가며 체크하기 위해 리스트에 담음
        var list1 = new List<int>(deliveries);
        var list2 = new List<int>(pickups);
        
        while(list1.Count > 0 || list2.Count > 0)
        {
            // 2) 택배상자를 배달, 수거
            if(list1.Count > 0) Function(list1, cap);
            if(list2.Count > 0) Function(list2, cap);
            
            // 3) 왕복거리 측정
            int moveDir = (list1.Count > list2.Count) ? list1.Count : list2.Count;
            answer += (long)moveDir * 2; // 이동거리
        }
        
        return answer;
    }
    
    // 택배를 배달하거나 수거하는 메서드
    public void Function(List<int> list, int cap)
    {
        // 1. 리스트의 마지막 인덱스가 0이 아닐 때까지 지움
        while(list.Count > 0 && list[list.Count - 1] == 0)
            list.RemoveAt(list.Count - 1);
        
        int currIndex = list.Count - 1;
        // 2. 택배 상자를 배달하거나 수거
        while(currIndex >= 0 && cap > 0)
        {
            if(list[currIndex] > 0)
            {
                list[currIndex]--;
                cap--;
            }
            else
                currIndex--;
        }
    }
}
728x90