BOJ 16496 큰 수 만들기
BOJ 16496 큰 수 만들기
https://www.acmicpc.net/problem/16496
문제
음이 아닌 정수가 N개 들어있는 리스트가 주어졌을 때, 리스트에 포함된 수를 나열하여 만들 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 리스트에 포함된 수가 주어진다. 수는 공백으로 구분되어져 있고, 1,000,000,000보다 작거나 같은 음이 아닌 정수 이다. 0을 제외한 나머지 수는 0으로 시작하지 않으며, 0이 주어지는 경우 0 하나가 주어진다.
출력
리스트에 포함된 수를 나열하여 만들 수 있는 가장 큰 수를 출력한다. 수는 0으로 시작하면 안되며, 0이 정답인 경우 0 하나를 출력해야 한다.
예제 입력 1
5 3 30 34 5 9
예제 출력 1
9534330
예제 입력 2
5 0 0 0 0 1
예제 출력 2
10000
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
/**
* 입력받은 수를 나열해야 하기 때문에 그냥 String 형으로 입력받는다.
* 두 수를 이어붙였을 때, 앞에 붙였을 때 더 큰 수가 나오는 수를 먼저 뽑기 위한 우선순위 큐
*/
PriorityQueue<String> queue = new PriorityQueue<>((s1, s2) -> {
if((s1 + s2).compareTo(s2 + s1) > 0) return -1;
return 1;
});
for (int i = 0; i < N; i++) queue.offer(st.nextToken());
// 차례로 우선순위 큐에서 수를 뽑아 정답 문자열에 추가
StringBuilder answer = new StringBuilder();
while (!queue.isEmpty()) answer.append(queue.poll());
/**
* 수가 0으로 시작하는 경우는, 모든 수가 0일 경우 밖에 없기 때문에
* 생성된 수가 전부 0으로만 이루어져 있을 때, 정답 문자열을 "0"으로 초기화
*/
int i = 0;
for (; i < answer.length() && answer.charAt(i) == '0'; i++) ;
if(i == answer.length()) answer = new StringBuilder("0");
System.out.println(answer);
}
}
This post is licensed under CC BY 4.0 by the author.