BOJ 10814 나이순 정렬
-
변수
int N // 회원 수 Class Person{ int age; String name; Constructor add ** 가장 중요한 comparable 정렬 코드 ** } PriorityQueue<Person> pq
-
구현로직
-
나이와 이름을 Class에 저장
-
정렬 함수를 사용해서 정렬
-
나이순, 나이가 같으면 이름순으로 정렬 (X)
=> 나이순으로 정렬, 나이가 같으면 가입한 순서로!
즉, 나이순서 정렬 코드와 PriorityQueue코드만 짜면 해결!
-
-
코드
package baekjoon.Silver; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.PriorityQueue; import java.util.StringTokenizer; public class BOJ_10814_나이순정렬 { public static class Person implements Comparable<Person> { int age, regDate; String name; public Person(int age, String name, int regDate) { super(); this.age = age; this.name = name; this.regDate = regDate; } @Override public int compareTo(Person o) { if (this.age == o.age) { // this.age == o.age return this.regDate - o.regDate; } return this.age - o.age; } } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); PriorityQueue<Person> pq = new PriorityQueue<Person>(); // 입력 받기 for (int tc = 1; tc <= N; tc++) { StringTokenizer st = new StringTokenizer(br.readLine()); int age = Integer.parseInt(st.nextToken()); String name = st.nextToken(); int regDate = tc; pq.add(new Person(age, name, regDate)); } StringBuilder sb = new StringBuilder(); while (!pq.isEmpty()) { Person p = pq.poll(); sb.append(p.age).append(' ').append(p.name).append('\n'); } System.out.println(sb); } }
-
배울점 (짱많아…)
-
먼저 Class의 정렬 코드 암기!
-
implement Comparable (개발툴 사용가능하면 Override부분 자동 완성되지만, 코딩테스트 볼때는 암기해서 사용할수 있어야 돼!)
Class Person implement Comparable<Person> { int age; String name; // 생성자 생략 @Override public int compareTo(Person o){ if(this.age>o.age) return 1; else if (this.age<o.age) return -1; else { // this.age == o.age return 0; } } }
=> compareTo부분을 요약 if ~ else if 문으로 다 나눌 필요 없이
return this.age - o.age만 써줘도 가능
-
잘 안외워지거나 헷갈리는 부분
-
-
문제 잘 읽기!!
=> 문제가 나이가 같으면 이름순 정렬이 아닌 가입한 순서대로 출력이었음! (따라서 이름 정렬할 필요 X)
-
만약, 이름도 정렬했어야한다면?
String자체에 compareTo 가 구현이 되어있어!
this.age와 o.age가 같은 경우에 name 정렬 코드 활용해준다
-
-
틀린 이유 : regDate 비교를 안해줬다!
-
Leave a comment