흙금이네 블로그

[BOJ] 1461 - 도서관 (Python) 본문

알고리즘

[BOJ] 1461 - 도서관 (Python)

흙금 2022. 12. 24. 19:06

 

 

아이디어

 

책을 모두 제자리에 나두면 다시 0으로 돌아갈 필요가 없으므로 가장 멀리 있는 곳을 마지막에 들르도록 한다.

 

 

풀이

 

계산이 편하도록 책의 위치를 양수와 음수를 구분해 각각 pos와 nag 리스트로 받는다.

절대값 크기 기준으로 두 리스트를 정렬한 후 절대값이 가장 큰 값(빈 리스트인 경우 0)을 결과값에서 미리 뺀다.

M개 단위로 리스트에서 값을 꺼내 이중 가장 큰 값의 두 배(왕복 거리)를 결과값에 더해 나간다.

 

pos와 nag 리스트 모두 같은 원리로 처리하므로 코드를 묶어 move 함수를 정의하고 호출하도록 했다.

 

def move(li):
    global res
    while li:
        res += abs(li.pop())*2
        for _ in range(M-1):
            if not li:
                return
            li.pop()

N, M = map(int, input().split())
pos = []
nag = []
for n in map(int, input().split()):
    if n > 0:
        pos.append(n)
    else:
        nag.append(n)
pos.sort()
nag.sort(reverse=True)
res = -max(([0]+pos)[-1], -([0]+nag)[-1])
move(pos)
move(nag)
print(res)

 

Comments