728x90

문제

 

 

접근 방식

 

정렬 문제 해결을 위한 Comparator / Comparable

1431번: 시리얼 번호 첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또

da9dac.tistory.com

 

세 가지의 정렬 기준대로 시리얼 번호를 정렬해야 하는데

자바에서는 Comparator를 사용하여 정렬 메서드의 정렬 기준을 커스텀할 수 있다.

(블로그에 Comparator와 Comparable에 대해 정리해 둔 글이 있으니 참고하길 바란다.)

 

우선 첫 번째 정렬 기준은 문자열의 길이라 짧은 것이 가장 최우선이고

길이가 같다면 시리얼 번호의 각 자릿수의 합이 낮은 것

합도 같은 경우에는 사전순으로 정렬해준다.

public int compare(String o1, String o2) {
    if (o1.length() != o2.length()) {
        return o1.length() - o2.length();
    } else {
        int sum = sum(o1, o2);
        if (sum != 0) {
            return sum;
        }
        else {
            return o1.compareTo(o2);
        }
    }
}

 

이를 코드로 구현하면 위와 같은데

문자열의 길이가 서로 다른 경우 더 짧은 길이를 우선 정렬하고

길이가 같다면 두 문자열의 자릿수를 모두 합한 값으로 비교한 후에

이 값들이 같다면 사전순으로 비교해 준다.

 

문자열의 사전순 비교는 따로 구현할 필요 없이

String 클래스에 있는 compareTo 메서드를 사용해 주면 된다.

 

풀이

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int n = Integer.parseInt(br.readLine());

		String[] serials = new String[n];

		for (int i = 0; i < n; i++) {
			serials[i] = br.readLine();
		}

		Arrays.sort(serials, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				if (o1.length() != o2.length()) {
					return o1.length() - o2.length();
				} else {
					int sum = sum(o1, o2);
					if (sum != 0) {
						return sum;
					}
					else {
						return o1.compareTo(o2);
					}
				}
			}

			int sum(String o1, String o2) {
				int x = 0;
				int y = 0;

				for (int i = 0; i < o1.length(); i++) {
					char cx = o1.charAt(i);
					char cy = o2.charAt(i);

					if (Character.isDigit(cx)) x += (cx - '0');
					if (Character.isDigit(cy)) y += (cy - '0');
				}

				return x - y;
			}
		});

		for (String s : serials) {
			sb.append(s).append("\n");
		}

		System.out.println(sb);
	}
}

 

+ Recent posts