ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준_1461_도서관(python)
    Algorithm/백준_생각정리 2023. 2. 20. 15:21

    ★ 접근 방식

    - 입력에서 n,m의 최대 크기가 50이라고 했을 때 모든 경우의 수를 다 보아도 시간측면에서 크게 무리가 안 갈 것이라고 생각했다. 처음에는 이분탐색, 그리디라고 생각했다. 이분탐색을 쓰기에는 기준이 될 만한 값이 없어서 그리디라고 결정지었다.

     

    ★ 풀이

    - 마지막에는 원 점으로 돌아오지 않아도 되기에 절댓값이 맨 왼 쪽이 클지, 맨 오른쪽이 클 지 생각하는 두 가지 경우가 있다. 여러 조건문을 써가면서 절댓값이 어느 쪽이 더 클 지, -의 부호로만 이루어져 있을 지, +로만 이루어져 있을 지로 풀어 볼 수 있지만 너무 난잡해질 것 같애서 맨 왼쪽이 더 크다고 가정한 함수, 맨 오른쪽이 더 크다고 가정한 함수 두개를 비교해서 더 작은 값을 리턴한 것을 출력해줬다.

     

    n,m = map(int,input().split())
    
    data = list(map(int,input().split()))
    data.append(0)
    data.sort()
    zero_idx = data.index(0)
    
    # 왼쪽 *1, 오른쪽 * 1
    
    def left_multione():
        count = 0
        if zero_idx == 0:
            return float("inf")
        i = 0
        flag = 0
        while i < zero_idx:
            if flag == 0:
                count += abs(data[i])
                flag = 1
            else:
                count += abs(data[i]) * 2
            i += m
        i = len(data) - 1
        while i > zero_idx:
            count += abs(data[i]) * 2
            i -= m
        return count
    def right_multione():
        count = 0
        if zero_idx == len(data) - 1:
            return float("inf")
        flag = 0
        i = len(data) - 1
        while i > zero_idx:
            if flag == 0:
                count += abs(data[i])
                flag = 1
            else:
                count += abs(data[i]) * 2
            i -= m
        i = 0
        while i < zero_idx:
            count += abs(data[i]) * 2
            i += m
        return count
    result = float("inf")
    result = min(result,left_multione())
    result = min(result,right_multione())
    print(result)

     

    'Algorithm > 백준_생각정리' 카테고리의 다른 글

    백준_18430_무기공학(python)  (0) 2023.03.04
    백준_18310_안테나 (python)  (0) 2023.02.24
    백준_7576_토마토(python)  (0) 2023.02.16
    백준_13023_ABCDE(python)  (0) 2023.02.08
    백준_15662_톱니바퀴(2)(파이썬)  (0) 2023.02.01
Designed by Tistory.