https://www.acmicpc.net/problem/30970
문제
품질이냐 가격이냐, 그것이 문제로다..
진주 나들이를 온 보선이는 기념품으로 촉석루 미니어처를 사기로 했다. 촉석루는 진주성에 있는 누각이며 경상남도 유형문화재 중 하나로, 진주성의 남쪽 지휘대로 사용됨과 동시에 논개가 촉석루 앞 의암에서 순국한 것으로 알려져 유명한 곳이다.
촉석루 미니어처를 사기 위해 기념품 가게에 들른 보선이는 놀라움을 금치 못했다. 왜냐하면, 가게에는 각양각색의 촉석루 미니어처가 진열되어 있었기 때문이다. 그리고 모든 촉석루 미니어처는 장인이 한 땀 한 땀 심혈을 기울여서 만들어서 그런지 품질과 가격이 천차만별이었고, 품질과 가격이 전부 동일한 두 촉석루 미니어처는 없었다. 각양각색의 촉석루 미니어처를 본 보선이는 물욕이 폭발할 뻔했지만 가까스로 마음을 진정시키고, 촉석루 미니어처를 두 개만 사기로 했다. 보선이는 두 가지 방법으로 촉석루 미니어처를 골라보기로 했는데, 이는 다음과 같다.
- 진열되어 있는 촉석루 미니어처 중에서 품질이 가장 높은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 가격이 가장 낮은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 첫 번째 방법이다.
- 진열되어 있는 촉석루 미니어처 중에서 가격이 가장 낮은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 품질이 가장 높은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 두 번째 방법이다.
보선이가 각 방법에 따라 촉석루 미니어처들을 고르게 될 때 어떤 촉석루 미니어처들을 고르게 되는지 알아보자.
입력
첫 번째 줄에는 기념품 가게에 진열되어 있는 촉석루 미니어처의 개수 이 주어진다. (2 ≤ N ≤ 100,000)
두 번째 줄부터 개의 줄에 걸쳐 가게에 진열되어 있는 번째 촉석루 미니어처 종류의 품질 , 가격 가 공백으로 구분되어 주어진다. (1≤Q_i,P_i≤10000)입력으로 주어지는 모든 수는 정수이다.
출력
첫 번째 줄에는 첫 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다.
두 번째 줄에는 두 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다.
첫 번째 방법의 결과가 두 번째 방법의 결과에 영향을 미치지 않는다.
예제 입력 1 복사
4
3 1
2 2
2 3
1 1
예제 출력 1 복사
3 1 2 2
3 1 1 1
문제풀이(1)
1. 촉석루 미니어처 중 품질이 가장 높은 미니어처를 가져온다.
2. 여러개일 경우 가격이 가장 낮은 것을 가져온다.
3. 1-2를 1번더 반복한다.
4. 촉석루 미니어처 중 가격이 가장 낮은 미니어처를 가져온다.
5. 여러개일 경우 품질이 가장 높은 것을 가져온다.
6. 4-5를 1번더 반복한다.
1-3번을 반복했을 때의 결과를 추출하고, 4-6번을 반복한 결과를 추출한다.
첫번째 output으로 1-3번을 반복했을 경우의 상위 2순위를 출력하고,
두번째 output으로 4-6번을 반복했을 경우의 상위 2순위를 출력한다.
정렬 문제기때문에 sort에 조건을 정확하게 달아주는 것이 중요하다.
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [N, ...input] = require("fs").readFileSync(filePath).toString().trim().split("\n");
const miniatures = input.map((el) => el.split(" ").map(Number));
// 품질을 기준으로 내림차순, 가격 오름차순 정렬
const sortByQualityThenPrice = (a, b) => {
if (a[0] !== b[0]) return b[0] - a[0];
return a[1] - b[1];
};
// 가격을 기준으로 오름차순, 품질 내림차순 정렬
const sortByPriceThenQuality = (a, b) => {
if (a[1] !== b[1]) return a[1] - b[1];
return b[0] - a[0];
};
// 결과 출력 함수
const printTopTwo = (arr) => {
console.log(
arr
.slice(0, 2)
.map((item) => item.join(" "))
.join(" ")
);
};
// 첫 번째 정렬 및 출력
miniatures.sort(sortByQualityThenPrice);
printTopTwo(miniatures);
// 두 번째 정렬 및 출력
miniatures.sort(sortByPriceThenQuality);
printTopTwo(miniatures);
'Algorithm' 카테고리의 다른 글
[Baekjoon]31474번 양갈래 짝 맞추기 - Javascript (1) | 2024.03.11 |
---|---|
[Baekjoon]11899번 괄호 끼워넣기 - Javascript (0) | 2024.02.28 |
[Baekjoon]17254번 키보드 이벤트 - Javascript (1) | 2024.02.27 |
[Baekjoon]1835번 카드 - Javascript (0) | 2024.02.26 |
[Baekjoon]1590번 캠프가는 영식 - Javascript (0) | 2024.02.23 |