[백준/BOJ][Python] 16496번 큰 수 만들기

Eunding·2024년 4월 5일

algorithm

목록 보기
12/110

오늘의 회고

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



시도한 것

# 틀린 코드
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)

참고 블로그

1개의 댓글

comment-user-thumbnail
2024년 4월 28일

안녕하세요, 99클럽 그룹 리더 휴 입니다!
문제의 시도 방법 부터 풀이 방법까지 전략적으로 접근하신 모습이 보기 좋았습니다.
앞으로도 힘내서 매일 TIL 도전해 보세요! 화이팅입니다 :)
99클럽 https://bit.ly/3TN5TBL

답글 달기