[백준]1461-그리디(도서관)

문제풀이

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

  1. input 받기
    여러 개의 인풋을 받아 리스트를 형성하는 방식 익혀두기
n, m = map(int, input().split())
points = list(map(int, input().split()))
  1. 최소거리를 구하기 위해 양수인 좌표와 음수인 좌표를 나누기
plus=[]
minus=[]

for i in points:
	if i>0:
    	plus.append(i)
    else:
    	minus.append(i)
  1. 양수는 내림차순을 위해 reverse를 사용하고 음수는 abs를 이용해서 내림차순으로 만든다
  • 절댓값이 큰 값부터 움직어야 하기 때문이다
plus.sort(reverse=True)
minus.sort()
  1. 가장 거리가 먼 좌표는 마지막에 돌아오지 않고 이동해야 하기 때문에 구해야 한다
max_distance=0
for i in points:
	if abs(i)>abs(max_distance):
    	max_distance=i

max_distance를 0으로 설정해 두고 리스트에서 절댓값이 0보다 크면 update

  1. 절댓값이 가장 큰 수부터 시작하는 리스트에서 m씩 이동해서 distance에 추가한다
  • 예시 m=2, plus=[5, 4, 3, 2, 1]이면 (5, 4) (3, 2), (1) -> 5, 3, 1이 추가됨
distance=[]

for i in range(0, len(plus), m):
	if plus[i] != max_distance:
    	distance.append(plus[i])
        
for i in range(0, len(minus), m):
	if minus[i] != max_distance:
    	distance.append(minus[i])
  1. 총 이동거리를 max_distance로 설정하고 distance에서 하나씩 왕복거리로 더해줌
result = abs(max_distance)

for i in distance:
	result += abs(i*2)

print(result)

마무리

지금까지 풀었던 알고리즘 문제중에서는 가장 복잡했다.(초보이슈ㅠㅠ)
코드를 쓰면서 abs()를 반복하기 싫어서 처음부터 minus를 구성할 때 abs를 썼더니 오답이 나온다.
내 코드가 잘못된 것인지 뭐가 맞는지 확인해서 업데이트를 해야겠다.

좋은 웹페이지 즐겨찾기