가장 큰 수 | Lv.2
https://school.programmers.co.kr/learn/courses/30/lessons/42746

작성코드
str 정렬 후 join (실패)
def solution(numbers):
return "".join(sorted(list(map(str, numbers)), reverse=True))
- numbers 내 원소들을 string 형으로 변환 >> 내림차순 정렬 >> join으로 하나의 string 값으로 만듦
- numbers = [3, 30, 34, 5, 9]
>> 9534303
3 30 34인 경우 34 3 30 순으로 해야 가장 최대의 값이 나옴
순열 이용 (실패)
from itertools import permutations
def solution(numbers):
answer = 0
per = permutations(numbers, len(numbers))
for p in per:
per_int = int(''.join(map(str, p)))
if per_int > answer:
answer = per_int
return str(answer)
- 순열 함수를 이용하여 모든 경우의 수 계산
- answer 엔 max 값만 저장하도록 함(공간복잡도 측면)
- 시간초과 발생
이상 코드
def solution(numbers):
# numbers 원소들을 string 형태로 변환 후 저장
numbers_str = list(map(str, numbers))
# 원소의 길이가 1,000 이하이기 때문에 비교 시 최소한 3자리로 맞춰야 함 3, 30, 34 -> 333 303030 343434
numbers_str.sort(key = lambda num : num * 3, reverse = True)
# numbers_str 내 원소드를 연결, str -> int -> str 형태로 변환
return str(int(''.join(numbers_str)))
- 각각의 원소 nums * 3을 한 값을 key로 하여 정렬함으로써 3, 30, 34를 정렬할 수 있음
단순 3 30 34를 string 형태로 변환 후 정렬한다면 34 30 3 이 됨 (문제에서 요구하는 정렬은 34 3 30)
34 33 30으로 생각한다면 단순 sort를 써서 정렬해도 잘 됨!
-> 여기까지는 접근했었는데 3을 33으로 바꾸는 과정에서 구현 갈피를 못 잡음
-> nums * 3을 함!! 어차피 numbers 원소는 최대 1000, 즉 최소의 한 자리의 숫자를 비교하기 위해서는 세 자리로만 늘려도 된다는 것!
3 30 34 -> 333 303030 343434 --(sort)--> 343434 333 303030 - return 시 굳이 str -> int -> str으로 변환하는 이유는 0이 시작값일 경우 str은 "003"을 반환함, 앞의 0은 무시하도록 int 변환 후 문제 요건에 맞게 str으로 변환함
반응형
'Algorithm > programmers' 카테고리의 다른 글
| [프로그래머스] 디스크 컨트롤러 (0) | 2023.05.17 |
|---|---|
| [프로그래머스] 더 맵게 (0) | 2023.05.15 |
| [프로그래머스] 단어변환 (0) | 2023.05.11 |
| [프로그래머스] 게임 맵 최단거리 (1) | 2023.05.10 |
| [프로그래머스] 정수 삼각형 (0) | 2023.05.04 |
댓글