알고리즘

[백준, 자바, 10825번] 국영수 (2차원 배열 정렬 문제)

hminor 2024. 10. 11. 16:17
반응형

풀이

  • 2차원 배열 정렬 문제를 계속 찾고 싶었는데
  • 내가 원하는 적합한 문제였음.
  • 우선 해당 배열에 정수 타입 뿐만 아닌 문자열 타입 데이터도 함께 있는
  • Object배열이기에 더 마음에 들었음
  • 사실... 이전 다른 코테에서 2차원 배열 정렬에서 해당 코드를 잊어버려서... 크흑
  • 무튼 자바에서 정렬하는 방법이 여러가지 있지만 
  • 나는 아래의 정렬처럼 Comparator을 사용해서 각 인자값 별 조건에 따라 정렬하도록 함.
  • (근데 국영수라고 하니까 드라마의 인물이 떠오르긴 하네 ㅎㅎ)

 

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
public class _10825 {
    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;
        int N = Integer.parseInt(br.readLine());
        Object[][] mtx = new Object[N][4];

        for (int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine()," ");
            for (int j=0; j<4; j++) {
                if (j==0) mtx[i][j] = st.nextToken();
                else mtx[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        Arrays.sort(mtx, new Comparator<Object[]>() {
            public int compare(Object[] o1, Object[] o2) {
                if (o1[1]!=o2[1]) return Integer.compare((int)o2[1],(int)o1[1]);
                else if (o1[2]!=o2[2]) return Integer.compare((int)o1[2],(int)o2[2]);
                else if (o1[3]!=o2[3]) return Integer.compare((int)o2[3],(int)o1[3]);
                else {
                    String s_o1 = (String) o1[0];
                    String s_o2 = (String) o2[0];
                    return s_o1.compareTo(s_o2);
                }

            }
        });

        for (Object[] li: mtx) bw.write((String)li[0]+"\n");
        bw.flush();

    }
}