오늘은 처음으로 플레 큰 수 만들기 문제를 풀어봤다. 사실 그리디이기도 하고 만만해보여서 도전해봤는데 그저께부터 도전하다가 결국 구글링의 도움을 받은 문제이다..


# 틀린 코드
def sol(arr):
answer = ''
idx = 0
while True:
arr2 = []
arr.sort(key=lambda x: x[idx], reverse=True)
arr.sort(key=lambda x: x[-1], reverse=True)
idx += 1
for i in range(len(arr)):
if len(arr[i]) == idx:
answer += arr[i]
print(answer)
else:
arr2.append(arr[i:])
break
arr = arr2
return answer
n = int(input())
arr = list(input().split())
print(sol(arr))
처음 문제를 보고 자릿수대로 정렬을 해야겠다고 생각했다.
그래서 sort의 key 옵션을 써서 자릿수대로 정렬을 하려고 했는데 생각해보니까 주어지는 자릿수가 다 달라서 내가 적은 코드는 2자리에만 적용되는 코드였다...
1. 가장 긴 자릿수를 변수에 저장
# 같은 코드
q = max(map(lambda x : len(x), l))
q = max(len(x) for x in l)
2. ljust를 이용하여 '0'으로 q자릿수(가장 긴 자릿수)만큼 채우고 sort
l.sort(key= lambda x : x.ljust(q, '0'), reverse=True)
rjust( n , c=' ') : 문자열을 오른쪽으로 n만큼 정렬함. 빈칸은 c로 채워 넣는다.
ljust( n , c=' ') : 문자열을 왼쪽으로 n만큼 정렬함. 빈칸은 c로 채워 넣는다.
3. max 함수로 리스트를 하나씩 합치면서 앞에 놓는 게 큰 지, 뒤에 놓는 게 큰 지 비교하며 갱신
for x in l:
ans = max(x+ans,ans+x)
=> 여기서 놀랐던 점은 나는 지금까지 max함수는 int만 가능한지 알았다...문자열도 가능하다는 것을 처음 알았다!
import sys
input = sys.stdin.readline
n = int(input())
l = input().split()
q = max(map(lambda x : len(x), l))
l.sort(key= lambda x : x.ljust(q, '0'), reverse=True)
ans = ""
for x in l:
ans = max(x+ans,ans+x)
if int(ans) == 0:
print(0)
else:
print(ans)
안녕하세요, 99클럽 그룹 리더 휴 입니다!
문제의 시도 방법 부터 풀이 방법까지 전략적으로 접근하신 모습이 보기 좋았습니다.
앞으로도 힘내서 매일 TIL 도전해 보세요! 화이팅입니다 :)
99클럽 https://bit.ly/3TN5TBL