Java
[백준 2258] 정육점 (JAVA)
iheeeee6-6
2023. 6. 20. 16:25
728x90
https://www.acmicpc.net/problem/2258
2258번: 정육점
첫째 줄에 두 정수 N(1 ≤ N ≤ 100,000), M(1 ≤ M ≤ 2,147,483,647)이 주어진다. N은 덩어리의 개수를 의미하고, M은 은혜가 필요한 고기의 양이다. 다음 N개의 줄에는 각 고기 덩어리의 무게와 가격을 나
www.acmicpc.net
정렬과 그리디 문제였다.
가격 오름차순 정렬 -> 무게 내림차순 정렬 순으로 하고!첫번째 값(제일 싼 값)부터 총 무게값에 더하고, 총 가격에 해당 값의 가격을 넣는다.둘째 값부터는 이전 값의 가격이 꽁짜이기 때문에 총 가격을 둘째 값의 가격으로 넣는다.만일 이전 값의 가격과 같은 가격이라면, 그 고기도 사야하는 거기 때문에 총 가격에 둘째 값의 가격을 더한다.
필자는 answer에 Integer.MAX_VALUE를 넣고 포문이 끝난 후에도 answer 가 변동 없었다면 -1을 출력하게 했으나
*무게의 총 합과 가격의 총 합은 각각 2,147,483,647을 넘지 않는다. *
라는 주의사항이 있었다!!! Integer.MAX_VALUE값은 2,147,483,647이기 때문에 겹칠 수 있다..
따라서 answer 가 변동된 적이 있었는지 체크하는 변수를 따로 선언하여 문제를 해결했다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static class Node {
int w, cost;
Node(int w, int cost) {
this.cost = cost;
this.w = w;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.valueOf(st.nextToken());
int M = Integer.valueOf(st.nextToken());
Node[] list = new Node[N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
list[i] = new Node(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
Arrays.sort(list, (a, b) -> {
if (b.cost == a.cost)
return b.w - a.w;
else
return a.cost - b.cost;
});
int totalPrice = -1;
int totalGram = 0;
int answer = Integer.MAX_VALUE;
boolean isPossible = false;
for (int i = 0; i < N; i++) {
totalGram += list[i].w;
if (i > 0 && list[i - 1].cost == list[i].cost) {
totalPrice += list[i].cost;
} else {
totalPrice = list[i].cost;
}
if (totalGram >= M) {
isPossible = true;
answer = Math.min(answer, totalPrice);
}
}
bw.write(isPossible ? answer + "\n" : -1 + "\n");
bw.flush();
bw.close();
}
}