[백준] 10814: 나이순 정렬

SuKong·2020년 8월 13일
2
post-thumbnail

'10814- 나이순 정렬' 문제로 이동!

👉문제

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

👉입력

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

예시 -
3
21 Junkyu
21 Dohyun
20 Sunyoung

👉출력

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

예시 -
20 Sunyoung
21 Junkyu
21 Dohyun


✍내 풀이

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int[][] arr = new int[num][2];
		HashMap<Integer, String> map = new HashMap();
		for( int i = 0 ; i < num ; i++ ) {
			arr[i][0] = sc.nextInt();
			arr[i][1] = i;
			map.put(i, sc.next());
 		}
		Arrays.sort(arr, new Comparator<int[]> () {
			public int compare(int[] o1, int[] o2) {
				if(o1[0] != o2[0]) return Integer.compare(o1[0], o2[0]);
				return 0;
			}
		});
		
		for( int i = 0 ; i < num ; i++ ) {
			System.out.println(arr[i][0] + " " + map.get(arr[i][1]));
		}
	}
}


✍Note

  • Collections클래스에서 제공하는 sort를 커스텀해서 활용했다.
    Comparator를 생성해서 compare함수를 오버라이딩 함으로써 커스텀하는 방식으로 구현했다.
    해당 문제는 11650문제 풀이, 1181문제 풀이와 비슷한 문제로 인식했고, 같은 방식으로 문제를 풀었다.

  • 나이와 이름을 동시에 저장을 할 수 없으므로 map을 활용하였다.
    map과 이차원배열을 연결해주기 위해서 이차원배열에 나이와 입력받은 순서를 저장하고, map의 key로 입력받은 순서를 활용하고 value값으로는 해당 순서의 이름을 저장한다.
    arr[ sort된 인덱스 ][ 0 ] : 나이
    arr[ sort된 인덱스 ][ 1 ] : 입력받은 순서
    Map < 입력받은 순서, 이름 >

  1. arr[sort된 인덱스][0] (나이) 을 기준으로 배열 정렬
  2. 정렬된 arr에서 순서대로 arr[sort된 인덱스][0] ( 나이 )를 출력
  3. map.get(arr[sort된 인덱스][1]) 으로 이름 출력
profile
안녕하세요 🤗

0개의 댓글