문제
품질이냐 가격이냐, 그것이 문제로다..
진주 나들이를 온 보선이는 기념품으로 촉석루 미니어처를 사기로 했다. 촉석루는 진주성에 있는 누각이며 경상남도 유형문화재 중 하나로, 진주성의 남쪽 지휘대로 사용됨과 동시에 논개가 촉석루 앞 의암에서 순국한 것으로 알려져 유명한 곳이다.
촉석루 미니어처를 사기 위해 기념품 가게에 들른 보선이는 놀라움을 금치 못했다. 왜냐하면, 가게에는 각양각색의 촉석루 미니어처가 진열되어 있었기 때문이다. 그리고 모든 촉석루 미니어처는 장인이 한 땀 한 땀 심혈을 기울여서 만들어서 그런지 품질과 가격이 천차만별이었고, 품질과 가격이 전부 동일한 두 촉석루 미니어처는 없었다. 각양각색의 촉석루 미니어처를 본 보선이는 물욕이 폭발할 뻔했지만 가까스로 마음을 진정시키고, 촉석루 미니어처를 두 개만 사기로 했다. 보선이는 두 가지 방법으로 촉석루 미니어처를 골라보기로 했는데, 이는 다음과 같다.
- 진열되어 있는 촉석루 미니어처 중에서 품질이 가장 높은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 가격이 가장 낮은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 첫 번째 방법이다.
- 진열되어 있는 촉석루 미니어처 중에서 가격이 가장 낮은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 품질이 가장 높은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 두 번째 방법이다.
보선이가 각 방법에 따라 촉석루 미니어처들을 고르게 될 때 어떤 촉석루 미니어처들을 고르게 되는지 알아보자.
입력
첫 번째 줄에는 기념품 가게에 진열되어 있는 촉석루 미니어처의 개수 이 주어진다. (2 ≤ N ≤ 100 000)
두 번째 줄부터 개의 줄에 걸쳐 가게에 진열되어 있는 번째 촉석루 미니어처 종류의 품질 , 가격 가 공백으로 구분되어 주어진다. (
입력으로 주어지는 모든 수는 정수이다.
출력
첫 번째 줄에는 첫 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다.
두 번째 줄에는 두 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다.
첫 번째 방법의 결과가 두 번째 방법의 결과에 영향을 미치지 않는다.
문제 링크 : 선택의 기로
설명
간단하게 조건에 맞게 정렬해주면 되는 문제이다.
첫번째 조건에서는 품질이 높은 순위로 정렬 후 품질이 같다면 가격이 낮은 순(오름차순)
두번쩨 조건에서는 가격이 낮은 순위로 정렬 후 가격이 같다면 품질이 높은 순(내림차순)
그리고 두개씩 출력해주면 된다.
나는 살짝 하드 코딩으로 풀었는데 사실 우선순위 큐를 이용하면 금방 해결되는 문제다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[n][2];
for (int i = 0; i<n;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
if (a[0] != b[0]) {
return Integer.compare(b[0], a[0]); // 품질이 높은 순서로 정렬
} else {
return Integer.compare(a[1], b[1]); // 가격이 낮은 순서로 정렬
}
}
});
int[] firstMethodResult = {arr[0][0], arr[0][1], arr[1][0], arr[1][1]};
// 두 번째 방법에 따른 선택
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
if (a[1] != b[1]) {
return Integer.compare(a[1], b[1]); // 가격이 낮은 순서로 정렬
} else {
return Integer.compare(b[0], a[0]); // 품질이 높은 순서로 정렬
}
}
});
int[] secondMethodResult = {arr[0][0], arr[0][1], arr[1][0], arr[1][1]};
// 결과 출력
System.out.println(Arrays.toString(firstMethodResult).replaceAll("[\\[\\],]", ""));
System.out.println(Arrays.toString(secondMethodResult).replaceAll("[\\[\\],]", ""));
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 1912 연속합 (0) | 2023.12.28 |
---|---|
[Java] 백준 30974 What's your ETA? (2) | 2023.12.28 |
[Java] 백준 1149 RGB거리 (0) | 2023.12.23 |
[Java] 백준 1003 피보나치 함수 (0) | 2023.12.21 |
[Java] 백준 27127 수 나누기 게임 (1) | 2023.12.20 |