온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
예시 -
3
21 Junkyu
21 Dohyun
20 Sunyoung
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
예시 -
20 Sunyoung
21 Junkyu
21 Dohyun
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[][] arr = new int[num][2];
HashMap<Integer, String> map = new HashMap();
for( int i = 0 ; i < num ; i++ ) {
arr[i][0] = sc.nextInt();
arr[i][1] = i;
map.put(i, sc.next());
}
Arrays.sort(arr, new Comparator<int[]> () {
public int compare(int[] o1, int[] o2) {
if(o1[0] != o2[0]) return Integer.compare(o1[0], o2[0]);
return 0;
}
});
for( int i = 0 ; i < num ; i++ ) {
System.out.println(arr[i][0] + " " + map.get(arr[i][1]));
}
}
}
Collections클래스에서 제공하는 sort를 커스텀해서 활용했다.
Comparator를 생성해서 compare함수를 오버라이딩 함으로써 커스텀하는 방식으로 구현했다.
해당 문제는 11650문제 풀이, 1181문제 풀이와 비슷한 문제로 인식했고, 같은 방식으로 문제를 풀었다.
나이와 이름을 동시에 저장을 할 수 없으므로 map을 활용하였다.
map과 이차원배열을 연결해주기 위해서 이차원배열에 나이와 입력받은 순서를 저장하고, map의 key로 입력받은 순서를 활용하고 value값으로는 해당 순서의 이름을 저장한다.
arr[ sort된 인덱스 ][ 0 ] : 나이
arr[ sort된 인덱스 ][ 1 ] : 입력받은 순서
Map < 입력받은 순서, 이름 >