[ BOJ / Python ] 1461번 도서관

황승환·2022년 1월 6일
0

Python

목록 보기
80/498


우선 세준이의 위치는 0이고 책들 또한 0에 위치하기 때문에 음수 좌표에 갔다가 양수 좌표로 가는 것은 동선의 낭비이다. 그렇기 때문에 책들의 제자리를 입력 받은 뒤에 이를 음수 좌표와 양수 좌표의 배열로 나눠서 따로 저장하고, 음수 좌표와 양수 좌표를 절대값이 큰 순으로 정렬한 뒤에 각 배열의 가장 앞에서부터 m칸씩 이동하며 거리를 저장하는 배열에 원소를 넣어준다. 음수, 양수 좌표 배열의 길이가 m으로 나눠떨어지지 않을 경우 순회하지 않은 원소 중 가장 앞에 있는 원소를 거리 배열에 넣어주어 이 중 가장 큰 수는 한번만 더하고 나머지는 두번씩 더하여 해결하였다.

  • n과 m을 입력받는다.
  • 제자리 위치를 저장하는 배열 location을 선언한 뒤에 입력받는다.
  • 양수 좌표를 저장할 배열 positive를 선언한다.
  • 음수 좌표를 저장할 배열 negative를 선언한다.
  • 움직인 거리를 저장할 배열 distance를 선언한다.
  • location을 순회하는 i에 대한 for문을 돌린다.
    -> 만약 i가 0보다 크면 positive에 넣어준다.
    -> 그 외의 경우 negative에 넣어준다.
  • positive를 내림차순 정렬한다.
  • negative를 오름차순 정렬한다.
  • positive의 길이를 m으로 나눈 몫만큼 반복하는 i에 대한 for문을 돌린다.
    -> distance에 positive[m*i]를 추가한다.
  • 만약 positive의 길이가 m으로 나눠떨어지지 않을 경우 distance에 positive[(len(positive)//m)*m]을 추가한다.
  • negative의 길이를 m으로 나눈 몫만큼 반복하는 i에 대한 for문을 돌린다.
    -> distance에 negative[m*i]를 추가한다.
  • 만약 negative의 길이가 m으로 나눠떨어지지 않을 경우 distance에 negative[(len(positive)//m)*m]을 추가한다.
  • distance를 오름차순 정렬한다.
  • 정답을 저장할 변수 answer를 distance의 가장 뒤 원소로 정의하고 distance의 가장 뒤 원소를 제거한다.
  • answer에 distance 원소들의 총 합을 2배한 값을 더한다.
  • answer를 출력한다.

Code

n, m=map(int, input().split())
location=list(map(int, input().split()))
positive=[]
negative=[]
distance=[]
for i in location:
    if i>0:
        positive.append(i)
    else:
        negative.append(i)
positive.sort(reverse=True)
negative.sort()
for i in range(len(positive)//m):
    distance.append(positive[m*i])
if len(positive)%m>0:
    distance.append(positive[(len(positive)//m)*m])
for i in range(len(negative)//m):
    distance.append(abs(negative[m*i]))
if len(negative)%m>0:
    distance.append(abs(negative[(len(negative)//m)*m]))
distance.sort()
answer=distance.pop()
answer+=2*sum(distance)
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글