본문 바로가기
알고리즘/정렬

[java 백준] 실버 5/ 10814번 나이순정렬

by Meaning_ 2021. 8. 16.
728x90
반응형

https://www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
 
public class Main {
    public static String[][] arr;
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        arr = new String[n][2];
 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 2; j++) {
                arr[i][j] = sc.next();
            }
        }
 
        Arrays.sort(arr, new Comparator<String[]>() {
            @Override
            public int compare(String[] o1, String[] o2) {
                if (o1[0== o2[0]) {//나이가 같으면 가입순으로 정렬
                    return Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]);
                } else {
                    return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
                }
            }
        });
 
        for (int i = 0; i < n; i++) {
            System.out.println(arr[i][0+ " " + arr[i][1]);
        }
    }
 
}
cs

 

처음에는 버블정렬에서 swap 이용하는거 생각했는데 역시나 시간초가가 났다.

그래서 2차원배열을 만들고 이걸 어떻게 하면 정렬할 수 있을지 찾아보다가 

 

Arrays.sort(arr,Comparator) 를 이용하면 된다는 것을 발견했다..!

 

2차원 배열을 정렬하기 위해서는 Comparator를 Override하여 정렬하면 되는데, 

o1[0]은 배열의 0번째 요소를 가리키며 그것을 기준으로 비교한다는 것이다.

 

나이가 같으면 가입한 순서대로 정렬이 된다.

 

if (o1[0== o2[0]) {//나이가 같으면 가입순으로 정렬

                    return Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]);

                }

 

 

return Integer.compare(Integer.parseInt(o1[1]), Integer.parseInt(o2[1])); 

로 리턴문을 써도 된다!


나이가 다르면 비교를 해줘야한다.

else {

                    return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);

                }

얘도 마찬가지로 

return Integer.compare(Integer.parseInt(o1[0]), Integer.parseInt(o2[0]));

 

이렇게 리턴문을 써줘도 되고, 나이를 비교해서 오름차순으로 정렬해준다. 

 

Comparator


https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

 

Stranger'sLAB님 티스토리 글을 참고해서 혼자 정리해봤다. 원문 글이 너무 정리가 잘 되어있어서 링크타서

보는걸 강력하게 추천한다!!

 

Comparator란 무엇인가?

Comparator 인터페이스를 쓰러면 compare 메서드를 구현해야한다.

Comparator 인터페이스는 객체를 비교할 수 있도록 만들어준다

 

예를 들어 기본자료형끼리 비교를 할 때는 부등호를 이용하여 비교할 수 있지만, 객체끼리 비교를 한다면 (배열 안의 객체) 부등호로 비교할 수 없다. 10814번 처럼 0번째 요소(0열)를 기준으로 비교할지, 1번째 요소(1열)을 기준으로 비교할기 기준이 정해져 있지 않기 때문이다. 그렇기에 Comparator를 써서 객체를 비교할 수 있다.

 

Comparator의 경우, 매개변수가 두개 들어가는데 이건 매개변수로 들어오는 두가지 객체를 비교하는 것을 의미한다. 

 

 return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]); 의 경우 수의 범위를 넘어가지 않을 때는 답이 맞겠지만,

오버플로우또는 언더플로우가 발생하면 잘못된 결과를 얻게 된다. 

 

 

참고한 사이트 


 

https://seeminglyjs.tistory.com/164

 

[Java] 자바 2차원 배열 정렬 하는 법 간단히 알아보자!

2020-11-13 알고리즘 및 배열에 관련된 문제를 처리하다 보면, 각 배열을 정렬을 해야 하는 경우가 생기게 된다. 때문에 오늘은 이 정렬 중 2차원 배열을 정렬하는 방법을 알아보도록 하자. 흔히들 1

seeminglyjs.tistory.com

https://gre-eny.tistory.com/2

 

[Java] 2차원 배열 정렬 방법 Arrays.Sort(arr, Comparator)

1차원 배열 정렬 방법 오름차순으로 정렬이 된다. import java.util.Arrays; Arrays.sort(arr); 2차원 배열 정렬 방법 2차원 배열을 정렬하기 위해서는 Comparator를 Override하여 정렬 기준을 제시하면 된다. 예..

gre-eny.tistory.com

 

728x90
반응형

댓글