728x90
728x90
1. 정보
- 문제 출처: 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/42746)
- 난이도: 레벨 1
- 입력: <class 'list'>
- 출력: <class 'str'>
2. 접근 방법
- 모든 경우의 수를 만드는 것은 시간 초과
- 각 숫자를 비교해, 큰 숫자부터 집어 넣는 방식이 빠르다!!
- 숫자 첫째 자리부터 비교, 만약 숫자가 같다면 길이가 짧은 요소부터
- ['2', '50']이 주어졌을 때, 자릿 수가 다른 두 숫자를 어떻게 비교할까?
- 마지막 자릿 수를 늘려 숫자를 맞춘다 (e.g., 52 → 5222 vs 5220)
- 첫째 자릿수를 늘린다 (e.g., 3 → 3333 vs 3020)
- 0을 붙인다 (e.g., 3 → 3000 vd 3020)
- 전체를 반복한다 (e.g., 30 → 3030 vs 3020)
- 여러 개의 0으로 구성된 리스트가 들어올 때에는 0 하나만 반환되도록
3. 코드
# 코드를 더 줄여야 할 거 같은데... 🤔
def _len(num): return len(str(num))
def _equalizeMaxLen(max_len, num):
(full, remain) = divmod(max_len, _len(num))
new_num = str(num) * full + str(num)[:remain]
return new_num
def solution(numbers):
# 모든 값이 0인 케이스 고려
if sum(numbers) == 0: return '0'
# 자릿수 맞추기 1
max_len = len(str(max(numbers))) * 4
# 자릿수 맞추기 2
numbers = [(num,str(num)) if _len(num) == max_len else (num, _equalizeMaxLen(max_len, num)) for num in numbers]
numbers = list(sorted(numbers, key=lambda tupl:tupl[1], reverse=True))
numbers = [str(k) for k, num in numbers]
return str(int(("").join(numbers)))
320x100
'IT > 알고리즘' 카테고리의 다른 글
[파이썬 알고리즘 문제] 짝지어 제거하기 (0) | 2023.05.22 |
---|---|
[파이썬 알고리즘 문제] 영어 끝말잇기 (0) | 2023.05.22 |
[파이썬 알고리즘 문제] 최댓값과 최솟값 (0) | 2023.05.22 |
[파이썬 알고리즘 문제] 신규 아이디 추천 (0) | 2023.04.07 |