문제 해석
- 첫째 줄에 온라인 저지 회원 수(N)을 입력받는다.
- 둘째 줄부터는 입력받은 N만큼 회원의 나이와 이름을 입력받는다.
- 입력받은 회원 정보를 나이순으로 정렬하되, 나이가 동일할 경우 먼저 등록한 순으로 출력한다.
코드1
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
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));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
ArrayList<Member> list = new ArrayList<>();
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
list.add(new Member(i, Integer.parseInt(st.nextToken()), st.nextToken()));
}
Collections.sort(list);
for(int i = 0; i < N; i++) {
bw.write(list.get(i).toString());
}
br.close();
bw.flush();
bw.close();
}
}
class Member implements Comparable<Member>{
int index ;
int age;
String name;
public Member(int index, int age, String name) {
this.index = index;
this.age = age;
this.name = name;
}
@Override
public int compareTo(Member o) {
if (this.age != o.age) return this.age - o.age;
else return this.index - index;
}
public String toString() {
return age + " " + name + "\n";
}
}
결과1
- 하지만,,, 꽤 시간과 메모리가 많이나와서 다른 사람 코드를 보고 다시 작성해보았다. (아래부터)
코드2
import java.io.*;
import java.util.StringTokenizer;
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());
StringBuilder initMember[] = new StringBuilder[201];
for(int i = 0; i < 201; i++){
initMember[i] = new StringBuilder();
}
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int age = Integer.parseInt(st.nextToken());
initMember[age].append(age +" "+ st.nextToken() +"\n");
}
br.close();
for (StringBuilder sb : initMember) {
bw.write(sb.toString());
}
bw.flush();
bw.close();
}
}
- 처음 문제를 풀때는 클래스를 만들어 풀었다.
- 하지만, 시간이 너무 많이 나와서 StringBuilder 배열을 사용했는데 해당 나이를 인덱스를 둔다는 생각을 하지 못했기 때문에 신선했다. (차피 값이 없는 값은 출력을 해도 빈값이니까)
- 이렇게 되면 등록순서 인덱스 값이 필요 없게된다. (순서대로 StringBuilder에 나이 이름 순으로 줄바꿈까지 추가해서 저장하기 때문에
결과2
- 속도는 확실히 앞보단 줄었지만 여전히 많이 나온다.... 좀 보완해야할 사항인 것 같다.
느낀점
- 항상 익숙한 형태로만 풀려고 해서 시간이나 메모리 부분을 크게 줄일 수 없는 것 같다...
- 좀 더 효율적인 방법과 참신한 방법으로 풀기도 해야하는데 그 부분에 있어아직 미숙한 것 같다.