[Python] 백준 1461 도서관

2021. 10. 27. 17:41·CS/알고리즘 & 문제풀이

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

 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net

1. 접근 방법

마지막 책을 옮긴 후 다시 원점으로 돌아올 필요가 없어서 가장 멀리 있는 위치를 마지막에 가는 것은 어렵기 않게 생각했는데, 세부적 구현에서 많이 고민했다.

최적의 위치를 잘 찾는것이 이 문제의 가장 중요한 부분이라 생각한다.

 

 

2. 풀이 코드

🖥python 코드

import sys
input = sys.stdin.readline
MIIS = lambda: map(int, input().split())


n, m = MIIS()
books = MIIS()

# 양수 좌표, 음수 좌표로 나누가
positives = []
negatives = []
for book in books:
    if book > 0:
        positives.append(book)
    else:
        negatives.append(abs(book))

positives.sort(reverse=True)
negatives.sort(reverse=True)

positive_times = positives[::m]
negative_times = negatives[::m]


# 조건별로 처리 >> 출력
if not positive_times:
    print(sum(negative_times) * 2 - negative_times[0])
elif not negative_times:
    print(sum(positive_times) * 2 - positive_times[0])
elif positive_times[0] >= negative_times[0]:
    print((sum(positive_times) + sum(negative_times)) * 2 - positive_times[0])
elif positive_times[0] < negative_times[0]:
    print((sum(positive_times) + sum(negative_times)) * 2 - negative_times[0])

📕풀이 방법

1. 이동을 최소로 하기 위해 가장 먼저 양수, 음수 좌표끼리 구분한다. 한 번에 책을 여러 권 든다고 해도 양수, 음수 좌표를 동시에 가면 최적의 시간을 구하지 못할 수도 있다.

2. 각 음수, 양수 좌표에서, 가장 멀리 있는 위치에서 시작해서 m개 마다 위치를 가져온다.

    이 부분을 떠올리기 쉽지 않았는데, 가장 먼 위치를 기준으로 한다면, 그보다 앞에 있는 위치는 가는 길에 무조건 들렀다 갈 수 있기 때문에 가장 먼 위치부터 하는 방법이 옳다

3. 양수, 음수 좌표에서 모두 계산을 하고나서, 가장 멀리 있는 위치는 편도만 가도록 하고, 나머지 위치는 왕복으로 길이를 계산하여 출력한다.

 

 

3. 생각 정리

인덱스를 잘 끊어서 해결하는 부분이 많이 햇갈렸다.

처음 시도는 while문으로 했는데, 예를 들어 m=3이면 1개를 뽑아 길이 계산으로 사용하고, 나머지 2개는 그냥 pop을 하거나 인덱스만 더해서 넘어가도록 했다.

그다음에는 for문 range에서 범위를 설정하려 했는데, 결과적으로 리스트 슬라이싱과 같은 방식이라서 슬라이싱으로 문제를 해결했다.

'CS > 알고리즘 & 문제풀이' 카테고리의 다른 글

[Python] 백준 16888 루트 게임  (0) 2021.10.28
[Python] 백준 3109 빵집  (0) 2021.10.28
[Python] 백준 20056 마법사 상어와 파이어볼  (0) 2021.10.25
[Python] 소가 길을 건나간 이유 7  (0) 2021.10.25
[Python] 백준 21608 상어 초등학교  (0) 2021.10.22
'CS/알고리즘 & 문제풀이' 카테고리의 다른 글
  • [Python] 백준 16888 루트 게임
  • [Python] 백준 3109 빵집
  • [Python] 백준 20056 마법사 상어와 파이어볼
  • [Python] 소가 길을 건나간 이유 7
mintropy
mintropy
민트로피의 하루하루 오늘보다 더 나은 내일
  • mintropy
    민트로피의 민트초코
    mintropy
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 생각 정리
        • 코딩테스트
        • SSAFY
      • 디지털 노트
        • Obsidian.md
        • Notion
      • CS
        • 알고리즘 & 문제풀이
        • AI
        • DB
        • 디자인패턴
      • Projects
      • Python
        • Python Web Framework
      • JavaScript
        • React.js
      • Docker
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pydantic
    프로그래머스
    DRF
    백준
    구현
    markdown
    게임이론
    그리디
    bfs
    Combinatorics
    dfs
    union-find
    DP
    ps
    trie
    django
    코딩테스트
    파이썬
    조건분기
    프로젝트
    카카오
    Python
    브루트포스
    web framework
    알고리즘
    fastapi
    line
    SSAFY
    project_zero
    회고
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
mintropy
[Python] 백준 1461 도서관
상단으로

티스토리툴바