

이 문제는 회원의 수가 주어지고, 나이와 이름을 입력받아 나이가 어린순으로 정렬하고, 나이가 같으면 먼저 가입한 사람이 앞으로 오는 순으로 정렬하여 나이와 이름을 출력하는 문제입니다.
인접정렬, Comparator, 람다식
두가지 원소를 입력받아 각각을 정해진 기준을 통해 비교 이후 정렬해주어야 하므로, 정렬 기준을 세울 수 있는 Comparator 을 생각했고,Arrays.sort() 의 두번째 파라미터에 람다식을 작성하여 풀어주었습니다.
당연하게 풀었는데 풀고 나니 궁금했던점.
람다식에 나이의 차를 리턴하여 나이를 오름차순으로 정렬해주었고, 이름은 입력순서대로 배열에 넣어주었으니까 정렬 할 필요가 없는데
왜 나이를 정렬하면 이름도 세트로 정렬되어 올라가는걸까 ?
로직 작성할때 나이 기준으로만 정렬했으니 2차원의 배열에서 나이 열만이 정렬되고, 이름 열도 따로 정렬을 해주어야 하는게 아닐까? 일단 맞았으니 세트로 정렬되긴 하겠다만 당연한게 어딨어 궁금해서 찾아봤는데
Arrays.sort() 를 포함해서 일반적인 정렬 알고리즘은 배열의 각 원소를 통째로 다루어 만약 한 열을 기준으로 정렬한다면, 그 행 전체가 함께 이동합니다.
그래서, 나는 나이를 기준으로 정렬했는데 이름도 알아서 세트로 정렬되었던 것.
그렇답니다.
로직은 다음과 같습니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.StringTokenizer;
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());
// 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞으로 오게
// 2차원 배열 생성 한 다음에 람다식
String[][] arr = new String[n][2];
for(int i=0; i<n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
arr[i][0] = st.nextToken(); // 나이
arr[i][1] = st.nextToken(); // 이름
}
Arrays.sort(arr, (e1,e2)-> {
// 나이는 오름차순으로 정렬
// 이름은 정렬 안해도 냅두면 들어온 순서라 따로 처리 안해도 됨
return Integer.parseInt(e1[0]) -Integer.parseInt(e2[0]);
});
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++){
sb.append(arr[i][0] + " ").append(arr[i][1]).append("\n");
}
System.out.println(sb);
}
}