J

[JAVA] BOJ ๋ฐฑ์ค€ 1202 ๋ณด์„๋„๋‘‘ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ‡ BOJ

[JAVA] BOJ ๋ฐฑ์ค€ 1202 ๋ณด์„๋„๋‘‘

snowball๐Ÿฐ 2023. 8. 9. 22:04

ํ’€์ด

  1. ์ฒ˜์Œ ๋ณด์„์„ ์ž…๋ ฅ ๋ฐ›๊ณ  compareTo ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณด์„์„ ๊ฐ€๋ฒผ์šด ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  2. ์ด๋•Œ ๋ฌด๊ฒŒ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋” ๊ฐ€์น˜์žˆ๋Š” ๊ฒƒ์„ ์•ž์— ์˜ค๊ฒŒ ํ•œ๋‹ค.
  3. ๊ฐ€๋ฐฉ์„ priorityQueue์— ์ €์žฅํ•˜์—ฌ ๊ฐ€๋ฒผ์šด ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๊ฒŒ ํ•œ๋‹ค.
  4. ๊ฐ€๋ฐฉ์„ pq์—์„œ ๋ฝ‘์€ ๋‹ค์Œ findJewel์— ํ•ด๋‹น ๊ฐ€๋ฐฉ๋ณด๋‹ค ์ž‘์€ ๋ณด์„๋งŒ ๋„ฃ์–ด์ฃผ๋„๋ก for๋ฌธ์„ ํ†ตํ•ด ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
  5. findJewel์€ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค.
  6. ํ•ด๋‹น ๊ฐ€๋ฐฉ์— ๋„ฃ์„ ํ›„๋ณด ๋ณด์„์ด ์•„์˜ˆ ์—†์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ findJewel์ด empty์ธ ๊ฒฝ์šฐ continue ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  7. pq๋ฅผ ํ†ตํ•ด ๋ฝ‘์€ ๋ณด์„์€ ๊ทธ ์ค‘ ๊ฐ€์žฅ ๊ฐ€์น˜์žˆ๋Š” ๋ณด์„์ด๋ฏ€๋กœ ๋ฐ”๋กœ result์— ๋”ํ•ด์ค€๋‹ค.

์ „์ฒด ์ฝ”๋“œ

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

public class Main {
	static class jewel implements Comparable<jewel>{
		int weight;
		int value;

		public jewel(int weight, int value){
			this.weight = weight;
			this.value = value;
		}

		@Override
		public int compareTo(jewel jewel) {
			int r = Integer.compare(this.weight, jewel.weight);
			if(r == 0)
				r = -Integer.compare(this.value, jewel.value);
			return r;
			// ๊ฐ€๋ฒผ์šด ๊ฑฐ >> ๋” ๊ฐ€์น˜์žˆ๋Š” ๊ฑฐ
		}
	}
	static PriorityQueue<Long> bags;
	static PriorityQueue<jewel> findJewels;
	static int K;
	public static void main(String[] args) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
		int N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());

		jewel[] jewels = new jewel[N];
		findJewels = new PriorityQueue<>((o1, o2) -> -Integer.compare(o1.value, o2.value));
		bags = new PriorityQueue<>();
		for(int i=0; i<N; i++){
			st = new StringTokenizer(bf.readLine(), " ");
			jewels[i] = new jewel(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
		}

		Arrays.sort(jewels);

		for(int i=0; i<K; i++)
			bags.offer(Long.parseLong(bf.readLine()));

		int i = 0; long result = 0;

		while(!bags.isEmpty()){
			long b = bags.poll();
			for(; i<N; i++){
				if(b < jewels[i].weight) break;
				findJewels.offer(jewels[i]);
			}
			if(findJewels.isEmpty()) continue;

			jewel j = findJewels.poll();
			result += j.value;

		}
		System.out.println(result);
	}
}
Comments