[백준]1461-그리디(도서관)
문제풀이
문제 https://www.acmicpc.net/problem/1461
- input 받기
여러 개의 인풋을 받아 리스트를 형성하는 방식 익혀두기
n, m = map(int, input().split())
points = list(map(int, input().split()))
- 최소거리를 구하기 위해 양수인 좌표와 음수인 좌표를 나누기
plus=[]
minus=[]
for i in points:
if i>0:
plus.append(i)
else:
minus.append(i)
- 양수는 내림차순을 위해 reverse를 사용하고 음수는 abs를 이용해서 내림차순으로 만든다
- 절댓값이 큰 값부터 움직어야 하기 때문이다
plus.sort(reverse=True)
minus.sort()
- 가장 거리가 먼 좌표는 마지막에 돌아오지 않고 이동해야 하기 때문에 구해야 한다
max_distance=0
for i in points:
if abs(i)>abs(max_distance):
max_distance=i
max_distance를 0으로 설정해 두고 리스트에서 절댓값이 0보다 크면 update
- 절댓값이 가장 큰 수부터 시작하는 리스트에서 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])
- 총 이동거리를 max_distance로 설정하고 distance에서 하나씩 왕복거리로 더해줌
result = abs(max_distance)
for i in distance:
result += abs(i*2)
print(result)
마무리
지금까지 풀었던 알고리즘 문제중에서는 가장 복잡했다.(초보이슈ㅠㅠ)
코드를 쓰면서 abs()를 반복하기 싫어서 처음부터 minus를 구성할 때 abs를 썼더니 오답이 나온다.
내 코드가 잘못된 것인지 뭐가 맞는지 확인해서 업데이트를 해야겠다.
Author And Source
이 문제에 관하여([백준]1461-그리디(도서관)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shs131/백준1461-그리디도서관저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)