https://www.acmicpc.net/problem/10814
문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
풀이 방법
먼저 나이와 이름을 함께 정렬해야하므로 이차원 문자열 배열을 생성한 뒤 값을 다 넣어주었다.
이제 나이의 대소를 기준으로 정렬하면 된다.
이번 문제도 Arrays.sort 내장 함수를 사용했다.
Comparator 인터페이스의 compare 메소드를 익명 객체로 구현하여 정렬 기준을 제시하였다.
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int N = Integer.parseInt(bf.readLine());
String[][] array = new String[N][2];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(bf.readLine(), " ");
for(int j = 0; j < 2; j++) {
array[i][j] = st.nextToken();
}
}
Arrays.sort(array , new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
};
});
for(int i = 0; i < N; i++) {
for(int j = 0; j < 1; j++) {
bw.write(array[i][j] + " ");
bw.write(array[i][j+1] + "\n");
}
}
bw.flush();
}
}
느낀점
상위에 랭크 되어 있는 소스코드들과 나의 코드를 비교해봤는데 실행 시간이 4배나 차이났다..
어떤 방법을 사용하였나 분석해보았다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) throws IOException {
try (
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));) {
int T = Integer.parseInt(br.readLine());
StringBuilder[] ageSb = new StringBuilder[201];
for (int i = 0; i < 201; i++) {
ageSb[i] = new StringBuilder("");
}
for (int i = 0; i < T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int age = Integer.parseInt(st.nextToken());
ageSb[age].append(age).append(" ").append(st.nextToken()).append("\n");
}
for (StringBuilder sb :
ageSb) {
bw.write(sb.toString());
}
}
}
}
위의 코드는 랭크에 기재되어 있는 소스코드이다.
분석해보았는데 무척 간단하고 기발했다. 나이의 범위는 0부터 200까지라고 조건이 명시 되어있으니 해시테이블과 카운팅정렬처럼 키 값을 설정하는데에 무리가 없다.
ageSb[ age ]에는 age와 입력 이름이 더해진다.
age가 14라고 가정해보자.
ageSb[ 14 ]에는 14와 입력 이름이 더해진다.
만약 중복되는 입력 나이가 들어온다고하더라도 괜찮다.
ageSb[age].append(age).append(" ").append(st.nextToken()).append("\n");
이 코드에서 마지막 부분에 줄바꿈 처리를 해주고 있으니 출력할 때 오류 없이 잘 출력될 것이다.
굉장히 재미있고 유익한 코드였다.