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 |