온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
✅ 나이와 이름을 String 타입 2차원 배열
arr[][]
에 저장한 후,Arrays.sort(arr)
와Compatator
인터페이스를 사용하여 정렬을 수행한다. 기본적으로 나이가 적은 순으로 정렬해야 하므로 String 타입으로 저장된 나이를Integer.ParseInt(arr[0])
를 통해 정수로 변환하여 비교를 수행한다. 나이가 같은 경우에는 먼저 가입한 순으로 정렬해야 하는데, 이는 곧 입력 순이므로 따로 조건을 명시하지 않아도 자동으로 입력 순으로 정렬된다.
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
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, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
}
});
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(arr[i][0] + " " + arr[i][1]).append("\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}
➕ 다른 사람의 코드 1 : 내 풀이보다 시간이 훨씬 적게 걸린 코드를 보니 2차원 배열 대신 나이, 이름을 저장할 수 있는 클래스를 생성하여 해당 클래스 객체를 1차원 배열에 담아 정렬하는 방법이 있었다! 답을 맞추고 코드 길이를 줄이는 것도 중요하지만 가장 중요한 성능을 위해 메서드나 클래스를 따로 빼서 풀 수 있도록 좀 더 다양한 코드들을 보며 연습해야 할 것 같다,,
import java.io.*;
import java.util.*;
public class Main {
public static class Member { // 클래스 생성
int age;
String name;
public Member(int age, String name) { // 생성자
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return age + " " + name;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
Member[] member = new Member[n];
for(int i=0;i<n;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
member[i] = new Member(age, name);
}
Arrays.sort(member, new Comparator<Member>() {
@Override
public int compare(Member o1, Member o2) {
return o1.age - o2.age;
}
});
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(member[i]).append("\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}
➕ 다른 사람의 코드 2 :
Arrays.sort()
안에서Compatator
인터페이스를 구현하는 것이 아니라, Member 클래스 자체에서Comparable
인터페이스를 구현하는 방법도 있다! 클래스에서 구현하는 경우Comparator
인터페이스를 구현하면 오류가 발생하므로Comparable
인터페이스를 구현해야 한다!
import java.io.*;
import java.util.*;
public class Main {
static class Member implements Comparable<Member> {
int age;
String name;
public Member(int age, String name) { // 생성자
super();
this.age = age;
this.name = name;
}
@Override
public int compareTo(Member o) {
return this.age - o.age;
}
@Override
public String toString() {
return age + " " + name;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
Member[] member = new Member[n];
for(int i=0;i<n;i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
member[i] = new Member(age, name);
}
Arrays.sort(member);
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++) {
sb.append(member[i]).append("\n");
}
bw.write(sb + "");
br.close();
bw.close();
}
}