음이 아닌 정수가 N개 들어있는 리스트가 주어졌을 때, 리스트에 포함된 수를 나열하여 만들 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 리스트에 포함된 수가 주어진다. 수는 공백으로 구분되어져 있고, 1,000,000,000보다 작거나 같은 음이 아닌 정수 이다. 0을 제외한 나머지 수는 0으로 시작하지 않으며, 0이 주어지는 경우 0 하나가 주어진다.
리스트에 포함된 수를 나열하여 만들 수 있는 가장 큰 수를 출력한다. 수는 0으로 시작하면 안되며, 0이 정답인 경우 0 하나를 출력해야 한다.
import sys
n = int(input())
number = list(sys.stdin.readline().split())
stack = [number[0]]
# 일단 스택에 다 넣자, 스택을 항상 갱신하자!
for i in range(1, n):
tmp = stack.pop()
# 스택에서 빼낸 값보다 현재 값이 더 우선순위가 있다면
if int(tmp + number[i]) <= int(number[i] + tmp):
stack.append(tmp)
stack.append(number[i])
# 스택 갱신, 스택에서 빼낸 값이 더 우선순위가 있음
else:
# 스택에 값이 있다면 갱신해주고
check = []
if stack:
while stack:
last_value = stack.pop()
if int(last_value + number[i]) < int(number[i] + last_value):
stack.append(last_value)
break
else:
check.append(last_value)
stack.append(number[i])
if check:
check.reverse()
stack.extend(check)
stack.append(tmp)
# 스택이 비어 있다면
else:
stack.append(number[i])
stack.append(tmp)
stack.reverse()
answer = ''.join(stack)
print(0) if answer[0] == '0' else print(answer)
n = int(input())
number = input().split()
number.sort(key = lambda x: x*10)
answer = ''.join(number[::-1])
print(0) if answer[0] == '0' else print(answer)