휴대폰번호+정렬

LK 텔레콤에 근무하는 신입사원 정희에게 부장님이 새로운 업무를 지시했다. 고객들의 휴대폰 전화번호를 정렬하는 작업이다.

휴대폰 번호는 국번 3 자리와 중간국번 3자리 또는 4자리, 그리고 뒷 자리 수 4 자리로 총 10 개 혹은 11 개의 숫자로 이루어진다.

그리고 휴대폰 국번은 010, 011, 016, 017, 018, 019 의 여섯 가지가 존재한다. 국번과 중간국번, 뒷자리 수는 하이픈(“-”)으로 구분

된다.

부장님이 원하는 요구사항은 다음과 같다. 우선, 특정 국번 번호 순서로 정렬이 되어야 하며, 국번이 같은 경우에는 중간국번 숫자끼리 비교해서 오름차순 정렬이 되어야 하며, 중간 국번도 같은 경우에는 뒷자리 번호를 비교해서 오름차순으로 정렬이 되야 한다.

단, 부장님이 원하는 정렬순서는 국번이 같을 경우 중간국번 4 자리인 휴대폰 번호가 중간 국번 3 자리인 휴대폰 번호보다 항상 정렬 우선순위가 높다. 즉, 국번이 같은 경우 중간국번 4 자리인 휴대폰 번호가 중간국번 3자리인 휴대폰 번호보다 정렬 시 항상 먼저 등장한다.

예를 들어, 다음과 같은 휴대폰 번호를 정렬 한다고 하자.

011-275-3587

017-1111-2600

019-222-2222

017-111-1234

018-275-9562

010-333-1111

016-1235-3333

이 번호들을 017 / 011 / 018 / 019 / 010 / 016 국번 순으로, 그리고 중간국번 4 자리가 중간국번 3자리보다 우선순위가 높도록 정렬을 한다면, 아래와 같이 정렬이 될 것이다.

017-1111-2600

017-111-1234

011-275-3587

018-275-9562

019-222-2222

010-333-1111

016-1235-3333

위의 결과에서 첫 번째 라인의 017-1111-2600 과 두 번째 라인의 017-111-1234 를 비교해 보면, 중간국번 111 은 1111 보다 작으므로 일반적으로는 정렬 시 017-111-2600 이 먼저 등장해야 하나, 부장님의 요구사항에서 중간국번 4 자리가 중간국번 3 자리보다 항상 정렬 우선순위가 높다는 규칙 때문에 017-1111-2600 이 017-111-1234 보다 먼저 등장한 것을 알 수 있다.

Input
첫 줄에는 테스트 케이스의 개수 T ( 0 < T <= 20 ) 가 주어진다.

각각의 테스트케이스의 첫 번째 줄에는 정렬할 휴대폰 번호의 개수 N(0 < N <= 50) 이 주어진다.

테스트케이스의 두 번째 줄에는 0, 1, 6, 7, 8, 9 의 6개의 숫자가 임의의 순서로 표시된다.

이 숫자들은 휴대폰 국번을 의미하며, 6개의 숫자들이 나열되는 순서는 테스트 케이스마다 바뀔 수 있다. 당신은 이 순서대로 국번 별 순서로 휴대폰번호를 정렬해야 한다.

예를 들어, 숫자 7 1 8 9 0 6 이 표시됐다면 017 / 011 / 018 / 019 / 010 / 016 국번 순으로 정렬해야 한다.

세 번째 줄부터는 라인 당 하나씩의 휴대폰 번호가 N 개 만큼 입력된다. 휴대폰 번호에서 국번은 010, 011, 016, 017, 018, 019 의 여섯 가지만 입력되며, 휴대폰 번호는 0 부터 9 까지의 숫자와 “–“ 로 구성되며, 빈칸을 포함하지 않으며 그 외 다른 문자는 포함되지 않는다.

참고로, 우리나라 휴대폰 번호에서 010 국번의 경우 중간국번은 항상 4 자리지만 이 문제에서는 010 국번도 중간 국번이 3 자리가 될 수 있다고 정의한다.

즉, 모든 휴대폰번호는 국번에 상관없이 중간국번이 세자리 혹은 네 자리가 될 수 있다.

Output
각 테스트케이스의 결과 첫 줄은 “Case #X:”와 같이 “Case”뒤에 한 칸 띄우고 ”#”과 테스트 케이스 번호 X 를 출력한 후 “:” 을 찍고, 그 다음 라인부터 휴대폰번호가 정렬된 결과를 출력한다. 출력 포맷은 아래의 출력 샘플을 참조한다.

Source Code code format="java5" import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Scanner;

public class PhoneNumber { private String first; private String middle; private String last;

public PhoneNumber(String number) { String[] temp = number.split("-"); first = temp[0]; middle = temp[1]; last = temp[2]; }

public PhoneNumber(String first, String middle, String last) { this.first = first; this.middle = middle; this.last = last; }

@Override public String toString { return first + "-" + middle + "-" + last; }

public static class BossComparator implements Comparator { public static final int FIRST_COUNT = 6;

private List order = new ArrayList(FIRST_COUNT);

public void addOrder(int f) { order.add(f); }

public int compare(PhoneNumber o1, PhoneNumber o2) { int m = order.indexOf(o1.first.charAt(2) - '0'); int n = order.indexOf(o2.first.charAt(2) - '0');

if(m < n) { return -1; }           else if(m > n) { return 1; }           else { int p = o1.middle.length; int q = o2.middle.length;

if(p > q) { return -1; }               else if(p < q) { return 1; }               else { int r = o1.middle.compareTo(o2.middle); if(r != 0) { return r;                   } else { return o1.last.compareTo(o2.last); }               }            }        }    }

public static void main(String[] args) { Scanner scan = new Scanner(System.in);

int T = scan.nextInt;   // 테스트 케이스의 개수(0 < T <= 20)

for(int i = 0; i < T; i++) { int N = scan.nextInt;   // 정렬할 휴대폰 번호의 개수(0 < N <= 50)

List numbers = new LinkedList;

BossComparator comp = new BossComparator;

for(int j = 0; j < BossComparator.FIRST_COUNT; j++) { comp.addOrder(scan.nextInt); }

for(int j = 0; j < N; j++) { numbers.add(new PhoneNumber(scan.next)); }

Collections.sort(numbers, comp);

System.out.println("Case #" + (i + 1)); for(PhoneNumber n : numbers) { System.out.println(n); }       }    } } code

Comment