[BOJ] 백준 1202. 보석도둑

2024. 4. 10. 11:14· Java/BOJ

문제

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

 

1202번: 보석 도둑

첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci

www.acmicpc.net


풀이

 우선 순위 큐를 이용해 문제를 해결했습니다. 단순히 반복문 두 개로도 해결할 수는 있지만, 시간 복잡도가 300,000*300,000으로 제한 범위를 훨씬 넘어가게 됩니다.

 

 

 풀이 방법은 다음과 같습니다.

 

 1. 우선 보석을 무게에 대해 오름차순으로 정렬합니다. 그리고 무게가 같다면 가격에 대해 내림차순 정렬합니다.

 2. 가방은 배열에 담아 오름차순으로 정렬합니다.

 3. 가방에 대한 반복문을 돌립니다.

  3-1. 가방을 돌면서 가방보다 무게가 작은 보석을 우선순위 큐에 집어 넣습니다. 이때 우선 순위 큐는 가격에 대한 내림차순 정렬입니다.

  3-2. 큐가 비어있지 않다면, 가방에 넣을 수 있는 보석이 있다는 것이고 queue.poll을 통해 맨 앞 요소를 정답에 더해줍니다. 만약 큐가 비어있다면 가방에 넣을 수 있는 보석이 없다는 것입니다.


소스코드

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

public class B1202_보석도둑 {
    static Scanner sc = new Scanner(System.in);
    static int N,K;
    static int[] bags;
    static long ans;
    static class Gemstone implements Comparable<Gemstone>{
        int weight;
        int cost;
        Gemstone(int weight, int cost){
            this.weight = weight;
            this.cost = cost;
        }
        @Override
        public int compareTo(Gemstone g){
            if(weight==g.weight) return g.cost-cost;
            return weight-g.weight;
        }
    }
    static PriorityQueue<Gemstone> gemstones = new PriorityQueue<>();

    public static void main(String[] args) {
        input();
        Arrays.sort(bags);
        findMaxSum();
        System.out.println(ans);
    }

    static void input(){
        N = sc.nextInt();
        K = sc.nextInt();
        bags = new int[K];
        for(int i = 0;i<N;i++){
            int w = sc.nextInt();
            int c = sc.nextInt();
            gemstones.add(new Gemstone(w,c));
        }
        for(int i =0;i<K;i++){
            bags[i] = sc.nextInt();
        }
    }
    static void findMaxSum(){
        PriorityQueue<Gemstone> queue = new PriorityQueue<>(new Comparator<Gemstone>() {
            @Override
            public int compare(Gemstone o1, Gemstone o2) {
                return o2.cost - o1.cost;
            }
        });

        for(int i = 0;i<K;i++){
            while(!gemstones.isEmpty()&&gemstones.peek().weight<=bags[i]) queue.add(gemstones.poll());
            if(!queue.isEmpty()) ans+= queue.poll().cost;
        }
    }
}

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 5568. 카드놓기  (0) 2024.04.21
[BOJ] 백준 1863. 스카이라인 쉬운거  (0) 2024.04.18
[BOJ] 백준 11437. LCA  (0) 2024.04.08
[BOJ] 백준 3584. 가장 가까운 공통 조상  (1) 2024.04.07
[BOJ] 백준 17281. 야구  (0) 2024.04.02
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 5568. 카드놓기
  • [BOJ] 백준 1863. 스카이라인 쉬운거
  • [BOJ] 백준 11437. LCA
  • [BOJ] 백준 3584. 가장 가까운 공통 조상
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Java
  • 네트워크
  • 인프런
  • 자바스크립트
  • 한양대
  • 이석복
  • OS
  • 큐
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 자바
  • JCF
  • 프로그래머스
  • 레디스
  • 김영한
  • 백준
  • BOJ
  • 구현
  • 운영체제
  • 반효경
  • 스택

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 1202. 보석도둑
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.