Step-by-Step

[Java] 백준 14908 - 구두 수선공 본문

언어/JAVA

[Java] 백준 14908 - 구두 수선공

희주(KHJ) 2023. 1. 31. 22:39

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

 

14908번: 구두 수선공

최소 보상금을 지불하는 작업 순서를 출력해야 한다. 모든 작업은 입력에서의 번호(1~N)로 표시해야 한다. 모든 정수는 한 줄로 표시해야 하며, 각 작업은 공백 문자로 구분한다. 여러 가지 해답

www.acmicpc.net

 

정렬 조건

1. 일의 능률이 높은 순 (T/S)

2. i가 빠른 순

 

compare의 리턴값은 int 이기 때문에 if로 비교해서 1 or -1을 리턴하도록 하였다

PQ로 로직을 만들어 데이터를 넣고, 차근차근 빼서 출력해주면 됨

 

[코드]

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;

public class boj14908 {
	static class Process{
		int idx;
		double rate;
		public Process(int idx, double rate) {
			this.idx = idx;
			this.rate = rate;
		}
	}
	private static int N;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		N = Integer.parseInt(br.readLine());
		
		PriorityQueue<Process> pq = new PriorityQueue<Process>(new Comparator<Process>() {
			@Override
			public int compare(Process o1, Process o2) {				
				if(o1.rate==o2.rate)
					return o1.idx - o2.idx;
				
				if(o1.rate> o2.rate)
					return 1;
				
				return -1;
			}
		});
		
		for(int i=1; i<=N; i++) {
			String[] str = br.readLine().split(" ");
			double T = Double.parseDouble(str[0]);
			double S = Double.parseDouble(str[1]);
			
			double rate = T/S;
			pq.add(new Process(i,rate));
		}
		
		while(!pq.isEmpty())
			sb.append(pq.poll().idx+" ");
		System.out.println(sb.toString().trim());
	}
}

 

Comments