Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- Python
- 해시 테이블
- 정렬
- JavaScript
- 그리디
- 투 포인터
- SSAFY
- 수학
- 13164
- 트리
- DFS
- 싸피
- BFS
- 에라토스테네스의 체
- 브루트포스
- 플로이드-워셜
- 애드 혹
- 누적 합
- 문자열
- 이분 탐색
- 세그먼트 트리
- 정수론
- 2357
- 그래프
- boj
- 구현
- 슬라이딩 윈도우
- 맵
- 모던 JavaScript 튜토리얼
- DP
Archives
- Today
- Total
흙금이네 블로그
[BOJ] 1461 - 도서관 (Python) 본문
아이디어
책을 모두 제자리에 나두면 다시 0으로 돌아갈 필요가 없으므로 가장 멀리 있는 곳을 마지막에 들르도록 한다.
풀이
계산이 편하도록 책의 위치를 양수와 음수를 구분해 각각 pos와 nag 리스트로 받는다.
절대값 크기 기준으로 두 리스트를 정렬한 후 절대값이 가장 큰 값(빈 리스트인 경우 0)을 결과값에서 미리 뺀다.
M개 단위로 리스트에서 값을 꺼내 이중 가장 큰 값의 두 배(왕복 거리)를 결과값에 더해 나간다.
pos와 nag 리스트 모두 같은 원리로 처리하므로 코드를 묶어 move 함수를 정의하고 호출하도록 했다.
def move(li):
global res
while li:
res += abs(li.pop())*2
for _ in range(M-1):
if not li:
return
li.pop()
N, M = map(int, input().split())
pos = []
nag = []
for n in map(int, input().split()):
if n > 0:
pos.append(n)
else:
nag.append(n)
pos.sort()
nag.sort(reverse=True)
res = -max(([0]+pos)[-1], -([0]+nag)[-1])
move(pos)
move(nag)
print(res)
'알고리즘' 카테고리의 다른 글
[BOJ] 21758 - 꿀 따기 (Python) (0) | 2022.12.28 |
---|---|
[프로그래머스] 142085 - 디펜스 게임 (JavaScript) (0) | 2022.12.27 |
[BOJ] 9466 - 텀 프로젝트 (Python) (0) | 2022.12.27 |
[BOJ] 16120 - PPAP (Python) (0) | 2022.12.26 |
[BOJ] 1105 - 팔 (Python) (0) | 2022.12.25 |
Comments