BOJ 10814 나이순 정렬

1 minute read

  1. 변수

    int N // 회원 수
    Class Person{
        int age;
        String name;
           
        Constructor add
               
        ** 가장 중요한 comparable 정렬 코드 **
    }
    PriorityQueue<Person> pq
    
  2. 구현로직

    1. 나이와 이름을 Class에 저장

    2. 정렬 함수를 사용해서 정렬

    3. 나이순, 나이가 같으면 이름순으로 정렬 (X)

      => 나이순으로 정렬, 나이가 같으면 가입한 순서로!

      즉, 나이순서 정렬 코드와 PriorityQueue코드만 짜면 해결!

  3. 코드

    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);
    	}
    }
       
    
  4. 배울점 (짱많아…)

    • 먼저 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만 써줘도 가능

      • 잘 안외워지거나 헷갈리는 부분

        image

    • 문제 잘 읽기!!

      => 문제가 나이가 같으면 이름순 정렬이 아닌 가입한 순서대로 출력이었음! (따라서 이름 정렬할 필요 X)

      • 만약, 이름도 정렬했어야한다면?

        String자체에 compareTo 가 구현이 되어있어!

        this.age와 o.age가 같은 경우에 name 정렬 코드 활용해준다

        image

    • 틀린 이유 : regDate 비교를 안해줬다!

Leave a comment