ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023 KAKAO BLIND RECRUITMENT - 택배 배달과 수거하기
    코딩 테스트/Level 2 2023. 1. 6. 09:20
    반응형

    2023 KAKAO BLIND RECRUITMENT - 택배 배달과 수거하기

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

    cap=4 일 때, 최소 거리로 배달을 완료하는 방법은
    배달 갈 때 가장 먼 집부터 4개의 택배를 배달
    돌아올 때도 가장 먼 집부터 4개의 바구니를 회수하는 것이다. 

    배달시, 회수시 각각 터닝 포인트 후보들을 뽑은 뒤
    포인트의 쌍을 만들어 가장 먼 곳을 터닝  포인트로 잡으면 된다. 

    def solution(cap, n, deliveries, pickups):
        def get_points(array):
            points = []
            box, index = 0, n - 1
            while index > -1:
                if array[index] == 0:
                    index -= 1
                    continue
                if box == 0:
                    points.append(index)
                capacity = cap - box
                if array[index] < capacity:
                    box += array[index]
                    index -= 1
                elif array[index] == capacity:
                    box = 0
                    index -= 1
                else:
                    array[index] -= capacity
                    box = 0
            return points[::-1]
    
        answer = 0
        d_points, p_points = get_points(deliveries), get_points(pickups)
        while d_points or p_points:
            answer += max(d_points.pop() if d_points else 0, p_points.pop() if p_points else 0) + 1
        return answer * 2
    테스트 1 〉	통과 (0.01ms, 10.2MB)
    테스트 2 〉	통과 (0.00ms, 10.1MB)
    테스트 3 〉	통과 (0.02ms, 10.2MB)
    테스트 4 〉	통과 (0.02ms, 10.1MB)
    테스트 5 〉	통과 (0.06ms, 10.4MB)
    테스트 6 〉	통과 (0.03ms, 10.2MB)
    테스트 7 〉	통과 (0.61ms, 10.2MB)
    테스트 8 〉	통과 (1.52ms, 10.3MB)
    테스트 9 〉	통과 (8.10ms, 10.5MB)
    테스트 10 〉	통과 (5.00ms, 10.3MB)
    테스트 11 〉	통과 (5.03ms, 10.3MB)
    테스트 12 〉	통과 (3.37ms, 10.4MB)
    테스트 13 〉	통과 (3.26ms, 10.1MB)
    테스트 14 〉	통과 (1.57ms, 10.5MB)
    테스트 15 〉	통과 (23.96ms, 11.8MB)
    테스트 16 〉	통과 (1726.00ms, 69.6MB)
    테스트 17 〉	통과 (139.91ms, 17.2MB)
    테스트 18 〉	통과 (73.04ms, 15.6MB)
    테스트 19 〉	통과 (57.17ms, 13.2MB)
    테스트 20 〉	통과 (54.34ms, 13.9MB)

    조금 더 깔끔하게 만든다면.. 

    def solution(cap, n, deliveries, pickups):
        def get_points(array):
            points = []
            box, index = 0, n - 1
            while index > -1:
                if array[index] == 0:
                    index -= 1
                    continue
                if box == 0:
                    points.append(index)
                capacity = cap - box
                if array[index] <= capacity:
                    box += array[index]
                    index -= 1
                else:
                    array[index] -= capacity
                    box = 0
            return points[::-1]
    
        answer = 0
        d_points, p_points = get_points(deliveries), get_points(pickups)
        while d_points or p_points:
            answer += max(d_points.pop() if d_points else 0, p_points.pop() if p_points else 0) + 1
        return answer * 2
    테스트 1 〉	통과 (0.02ms, 10.2MB)
    테스트 2 〉	통과 (0.01ms, 10.1MB)
    테스트 3 〉	통과 (0.04ms, 10.3MB)
    테스트 4 〉	통과 (0.04ms, 10.1MB)
    테스트 5 〉	통과 (0.08ms, 10.2MB)
    테스트 6 〉	통과 (0.03ms, 10.2MB)
    테스트 7 〉	통과 (0.58ms, 10.4MB)
    테스트 8 〉	통과 (3.74ms, 10.4MB)
    테스트 9 〉	통과 (13.30ms, 10.5MB)
    테스트 10 〉	통과 (10.35ms, 10.3MB)
    테스트 11 〉	통과 (2.59ms, 10.3MB)
    테스트 12 〉	통과 (2.07ms, 10.3MB)
    테스트 13 〉	통과 (3.17ms, 10.2MB)
    테스트 14 〉	통과 (3.27ms, 10.4MB)
    테스트 15 〉	통과 (25.47ms, 11.7MB)
    테스트 16 〉	통과 (1677.43ms, 69.6MB)
    테스트 17 〉	통과 (183.93ms, 17.3MB)
    테스트 18 〉	통과 (70.82ms, 15.6MB)
    테스트 19 〉	통과 (55.63ms, 13.2MB)
    테스트 20 〉	통과 (63.75ms, 14MB)

    속도를 위해 뒤집지 않고...

    deque를 사용할 수도 있지만,
    iter를 사용하는 방법도 있다. 

    def solution(cap, n, deliveries, pickups):
        def get_points(array):
            points = []  # turning points
            box, index = 0, n - 1
            while index > -1:
                if array[index] == 0:
                    index -= 1
                    continue
                if box == 0:
                    points.append(index)
                capacity = cap - box
                if array[index] <= capacity:
                    box += array[index]
                    index -= 1
                else:
                    array[index] -= capacity
                    box = 0
            return iter(points), len(points)
    
        answer = 0
        (d_points, d_length), (p_points, p_length) = get_points(deliveries), get_points(pickups)
        for _ in range(max(d_length, p_length)):
            answer += max(next(d_points, 0), next(p_points, 0)) + 1
        return answer * 2

    조금 더 줄여 본다면.. 

    def solution(cap, n, deliveries, pickups):
        def get_points(array):
            points = []  # turning points
            box, index = 0, n - 1
            while index > -1:
                if array[index] == 0:
                    index -= 1
                    continue
                if box == 0:
                    points.append(index)
                capacity = cap - box
                if array[index] <= capacity:
                    box += array[index]
                    index -= 1
                else:
                    array[index] -= capacity
                    box = 0
            return iter(points), len(points)
    
        (d_points, d_length), (p_points, p_length) = get_points(deliveries), get_points(pickups)
        return sum(max(next(d_points, 0), next(p_points, 0)) + 1 for _ in range(max(d_length, p_length))) * 2
    테스트 1 〉	통과 (0.02ms, 10.3MB)
    테스트 2 〉	통과 (0.01ms, 10.4MB)
    테스트 3 〉	통과 (0.02ms, 10.2MB)
    테스트 4 〉	통과 (0.03ms, 10.2MB)
    테스트 5 〉	통과 (0.07ms, 10.2MB)
    테스트 6 〉	통과 (0.03ms, 10.3MB)
    테스트 7 〉	통과 (0.56ms, 10.3MB)
    테스트 8 〉	통과 (2.65ms, 10.3MB)
    테스트 9 〉	통과 (11.95ms, 10.5MB)
    테스트 10 〉	통과 (9.05ms, 10.4MB)
    테스트 11 〉	통과 (2.46ms, 10.3MB)
    테스트 12 〉	통과 (2.19ms, 10.3MB)
    테스트 13 〉	통과 (1.56ms, 10.3MB)
    테스트 14 〉	통과 (1.55ms, 10.3MB)
    테스트 15 〉	통과 (25.15ms, 11.8MB)
    테스트 16 〉	통과 (1584.63ms, 52.6MB)
    테스트 17 〉	통과 (159.17ms, 16.8MB)
    테스트 18 〉	통과 (110.32ms, 16MB)
    테스트 19 〉	통과 (45.79ms, 13.2MB)
    테스트 20 〉	통과 (76.35ms, 14MB)
    반응형
Designed by Tistory.