📝문제
https://www.acmicpc.net/problem/17503
💡풀이
선호도의 합이 M이상이고
마신 맥주가 N개를 만족해야한다.
1) 맥주 도수 레벨을 기준으로 배열을 오름차순하고
2) 우선순위 큐에 선호도 기준으로 오름차순한다.
3) 배열을 돌려 차례대로 우선순위 큐에 저장하고
4) 큐 사이즈가 N개가 되면 큐에 들어간 선호도 합을 계산한다.
4-1) 선호도 합이 M이상이면 현재 맥주의 도수 레벨이 정답이 되므로 반복문을 빠져나온다.
4-2) 선호도 합이 M 미만이면 다시 3)으로 돌아가서 가장 작은 선호도를 가진 맥주를 큐에서 빼낸다.
M 미만이면 바로 큐에서 빼지 않는 이유: 다음 선호도가 현재 최소 선호도보다 작을 수 있음!
import java.util.*;
import java.io.*;
class Main {
static int[][] beer;
static int N, M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());//기간
M = Integer.parseInt(st.nextToken());//선호도 합
int K = Integer.parseInt(st.nextToken());//맥주 종류
beer = new int[K][2];
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
beer[i][0] = Integer.parseInt(st.nextToken());//선호도
beer[i][1] = Integer.parseInt(st.nextToken());//도수레벨
}
Arrays.sort(beer, Comparator.comparingInt(a -> a[1])); //1) 도수 기준으로 오름차순
PriorityQueue<Integer> pq = new PriorityQueue<>(); //2) 선호도 기준으로 오름차순
int sum = 0; //선호도 합
int answer = -1;
for (int[] a : beer) {
int like = a[0];
int alcohol = a[1];
pq.add(like);
sum += like;
if (pq.size() > N) {
sum -= pq.poll();
}
if (pq.size() == N) {
if (sum >= M) { //선호도 합이 M이상 되어야 함
answer = alcohol;
break;
}
}
}
System.out.println(answer);
}
}
🤔Review
문제가 선호도 합이 M일때를 찾는 줄 알고 한참 헤맸다.. 문제 좀 제대로 읽자ㅜㅠ^^
'Algorithm' 카테고리의 다른 글
[Algorithm] 99클럽 코테 스터디 20일차 TIL | 백준_최소 회의실 개수(19598번) (5) | 2025.02.14 |
---|---|
[Algorithm] 99클럽 코테 스터디 19일차 TIL | 백준_신입 사원(1946번) (0) | 2025.02.13 |
[Algorithm] 99클럽 코테 스터디 17일차 TIL | 백준_ATM(11399번) (0) | 2025.02.11 |
[Algorithm] 99클럽 코테 스터디 16일차 TIL | 백준_고양이는 많을수록 좋다(27961번) (0) | 2025.02.10 |
[Algorithm] 99클럽 코테 스터디 15일차 TIL | 백준_치킨 배달(15686번) (0) | 2025.02.07 |