[Java] 백준 30970 선택의 기로

문제

품질이냐 가격이냐, 그것이 문제로다..

진주 나들이를 온 보선이는 기념품으로 촉석루 미니어처를 사기로 했다. 촉석루는 진주성에 있는 누각이며 경상남도 유형문화재 중 하나로, 진주성의 남쪽 지휘대로 사용됨과 동시에 논개가 촉석루 앞 의암에서 순국한 것으로 알려져 유명한 곳이다.

촉석루 미니어처를 사기 위해 기념품 가게에 들른 보선이는 놀라움을 금치 못했다. 왜냐하면, 가게에는 각양각색의 촉석루 미니어처가 진열되어 있었기 때문이다. 그리고 모든 촉석루 미니어처는 장인이 한 땀 한 땀 심혈을 기울여서 만들어서 그런지 품질과 가격이 천차만별이었고, 품질과 가격이 전부 동일한 두 촉석루 미니어처는 없었다. 각양각색의 촉석루 미니어처를 본 보선이는 물욕이 폭발할 뻔했지만 가까스로 마음을 진정시키고, 촉석루 미니어처를 두 개만 사기로 했다. 보선이는 두 가지 방법으로 촉석루 미니어처를 골라보기로 했는데, 이는 다음과 같다.

  • 진열되어 있는 촉석루 미니어처 중에서 품질이 가장 높은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 가격이 가장 낮은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 첫 번째 방법이다.
  • 진열되어 있는 촉석루 미니어처 중에서 가격이 가장 낮은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 품질이 가장 높은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 두 번째 방법이다.

보선이가 각 방법에 따라 촉석루 미니어처들을 고르게 될 때 어떤 촉석루 미니어처들을 고르게 되는지 알아보자.

 

입력

첫 번째 줄에는 기념품 가게에 진열되어 있는 촉석루 미니어처의 개수 이 주어진다. (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