백준 1461 도서관 (JAVA)

2023. 10. 16. 00:27·BackEnd/알고리즘 공부

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

 

1461번: 도서관

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

www.acmicpc.net

 

문제설명

0인 곳에서 돌아다니면서 책을 알맞은 위치까지 가져가야 합니다. 위 예제를 풀어보면 

{-39, -37}, {-29, -28}, {-6}, {2, 11}로 총 22 + 12 + 58 + 39 = 131입니다.

 

문제에 대한 아이디어

  • 처음에는 0에서 가까운 부분 부터 배달을 해야 하지 않을까?라는 고민을 했습니다. 하지만 경우의 수가 너무 많아져 복잡해집니다. 그래서 먼 곳부터 배달을 하는 방법을 생각해 봤습니다. 어차피 먼 곳에 배달을 해야 하니깐 먼 곳부터 m만큼 배달을 하는 것입니다. 
  • 두 번째 문제는 -6 만 선택하는 부분입니다. 두 곳씩 배달하다 보면 -6과 -28을 배달하게 될 것입니다. 그래서 음수의 먼 곳 양수의 먼 곳을 따로 생각해서 풀었습니다.
  • 마지막은 다시 안돌아와도 된다는 것을 해결해줘야 합니다. 양수에서 제일 큰 숫자, 음수에서 제일 큰 숫자를 비교해 더 큰 숫자를 마지막 합에서 빼주면 답이 됩니다.

 

전체 코드

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(buf.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        PriorityQueue<Integer> minusPq = new PriorityQueue<>();
        PriorityQueue<Integer> plusPq = new PriorityQueue<>((c1,c2) -> {
            return c2 - c1;
        });
        st = new StringTokenizer(buf.readLine());
        for(int i = 0; i < n; ++i){
            int num = Integer.parseInt(st.nextToken());
            if(num < 0) minusPq.add(num);
            else plusPq.add(num);
        }
        int answer = 0;
        int num = 0;
        // 더 먼 곳 선택
        if(plusPq.size() > 0 && minusPq.size() > 0) num = Math.max(Math.abs(minusPq.peek()), plusPq.peek());
        else {
            if(plusPq.size() > 0) num = plusPq.peek();
            else num = Math.abs(minusPq.peek());
        }
        // 음수 부분
        while(!minusPq.isEmpty()){
            for (int i = 0; i < m; ++i) {
                    int temp = minusPq.poll();
                    if (i == 0) answer += (Math.abs(temp) * 2);
                    if(minusPq.isEmpty()) break;
            }
        }
        // 양수 부분
        while(!plusPq.isEmpty()){
            for (int i = 0; i < m; ++i) {
                int temp = plusPq.poll();
                if (i == 0) answer += (Math.abs(temp) * 2);
                if(plusPq.isEmpty()) break;
            }
        }
        answer -= num;
        System.out.println(answer);
    }
}

https://github.com/SeWooooong/CodingTest_Practice/tree/main/%EB%B0%B1%EC%A4%80/Gold/1461.%E2%80%85%EB%8F%84%EC%84%9C%EA%B4%80

 

'BackEnd > 알고리즘 공부' 카테고리의 다른 글

등대 (프로그래머스) JAVA  (1) 2023.10.19
백준 17298 오큰수 자바  (2) 2023.10.18
백준 10799 쇠막대기 (JAVA)  (1) 2023.10.14
백준 11000 강의실 배정 (JAVA)  (1) 2023.10.14
백준 1976 여행 가자 (JAVA)  (0) 2023.10.12
'BackEnd/알고리즘 공부' 카테고리의 다른 글
  • 등대 (프로그래머스) JAVA
  • 백준 17298 오큰수 자바
  • 백준 10799 쇠막대기 (JAVA)
  • 백준 11000 강의실 배정 (JAVA)
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    정렬
    스프링 핵심 원리-기본편
    디팬스 게임
    네트워크 기본 용어
    querydsl
    자바
    쿼드 압축
    중첩 선언
    dp
    프로그래머스
    상속
    이것이 자바다
    자동 배포
    백트래킹
    다이나믹 프로그래밍
    유니온 파인드
    조합
    완전탐색
    VPN
    linux
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
백준 1461 도서관 (JAVA)
상단으로

티스토리툴바