본문 바로가기

BOJ/정렬

BOJ : 1461 도서관 (파이썬)

728x90

문제

https://www.acmicpc.net/problem/1461

 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net

풀이

양수 음수를 구분하는 배열을 생성 해줍니다.

 

첫 번째 조건은 양수인 거리만 존재할때,

반복문을 통해 결과값을 계산해줍니다. 왕복해야하기때문에 *2 를 해줍니다.

한번 왕복하면 count +=1 을 해줍니다.

제일 마지막에 다녀올때는 시작지점으로 올 필요가 없으므로 거리를 빼줍니다.

 

두번째 조건은 음수인 거리만 존재할 때입니다.

 

세번째 조건은 양수인 거리와 음수인 거리가 두개 다 존재할 때 입니다.

음수인 거리부터 순회하거나 양수인 거리부터 순회를 해서 통 거리값을 계산해줍니다.

그리고 마지막에 다녀올때 거리가 제일 먼 거리에 도착하는 것이 이동거리가 제일 적으니

양수,음수 거리에 절댓값이 큰 거리를 빼줍니다.

 

소스코드

import sys

pos = []
nev = []
sum1=0
sum2=0
result =0
count = 0

n,m = [int(x) for x in sys.stdin.readline().split()]
n=abs(n)
m=abs(m)
num_list = list(map(int, input().split()))

num_list.sort()

# 양수 음수 리스트
for i in num_list :
    if i >= 0 :
        pos.append(i)
    else :
        nev.append(-i)


if len(pos) > 0 and len(nev) == 0 :
    for w in range(n-1,-1,-m) :
        result += pos[w]*2
        count +=1
    if count >= n/m :
        result -= max(pos)
elif len(pos) == 0 and len(nev) > 0 :
    for z in range(0,n,m) :
        result += abs(nev[z]*2)
        count +=1
    if count >= n/m :
        result -= abs(max(nev))
elif len(pos) > 0 and len(nev) > 0 :
    for i in range(n-len(nev)-1,-1,-m) :
        result += pos[i] *2
        count +=1
    for j in range(0,n-len(pos),m) :
        result += abs(nev[j]*2) 
        count +=1
    if count >= (n/m) : 
        if max(pos) >= abs(max(nev)) :
            result -=max(pos)
        else :
            result -=abs(max(nev))


print(result)

 

 

 

728x90

'BOJ > 정렬' 카테고리의 다른 글

BOJ : 11870 좌표압축 (파이썬)  (0) 2022.12.02
BOJ : 2108 통계학 (파이썬)  (0) 2022.12.02
BOJ : 1927 최소힙 (파이썬)  (1) 2022.09.11
BOJ : 20291 파일정리 (파이썬)  (2) 2022.09.10
BOJ : 18310 안테나 (파이썬)  (0) 2022.09.07