본문 바로가기
💻 하나씩 차곡차곡/프로그래머스 (Python)

[프로그래머스/Lv.2/Python] 가장 큰 수

by 뚜루리 2024. 1. 25.
728x90
320x100

 

처음 풀이

from itertools import permutations

def solution(numbers):
    answer = ''
    arr = []
    for i in permutations(numbers, len(numbers)):
        arr.append(''.join(map(str,i)))
        
    arr = sorted(map(int, arr), reverse=True)
    return str(arr[0])
  • permutations 순열 함수를 사용하여 모든 경우의 수를 담고 가장 큰 수로 정렬한 후에 첫번째 인덱스의 값을 문자로 변환하여 리턴하는 방식으로 해주었는데, 테스트 케이스는 맞았지만 정확성에서 30점도 안되는 점수 획득.....ㅋ

 


다시 풀기

def solution(numbers):
    answer = ''
    
    # 문자 형변환
    numbers = list(map(str, numbers))
    
    # 3을 곱한 수로 내림차순 정렬
    numbers.sort(key=lambda x:x*3, reverse=True)
    
    # 리스트 -> 문자 형변환
    return str(int(''.join(numbers)))

 

설명 덧붙이기

1. 사전순으로 정렬해주기 위해서 numbers의 숫자들을 문자형태로 형변환 해준다.

numbers = list(map(str, numbers))
  • 왜 사전순으로 정렬하는가?
    • numbers가 [6, 10, 2] 일때 만들 수 있는 가장 큰 수는 6210이 된다. 그러나 숫자일 때 가장 큰 수를 만들면 '1061'가 되버리고 사전순으로 하면 6210으로 원하는 가장 큰 수가 나온다 그래서 사전 순으로 정렬해주는 것.

 

2. 리스트를 역순으로 정렬하되, 각 3을 곱한 수를 정렬한다.

numbers.sort(key=lambda x: x*3, reverse=True)
  • 왜 3을 곱해주는가?
    1. numbers가 [3, 30, 34, 5, 9] 일 때 사전순으로 정렬하면 [9, 5, 34, 30, 3] 이되는데 사실상 3이 30보다 먼저 앞으로 와야 함. 그렇다면 number는 1000이하의 숫자이니까 3을 곱해 최대 값을 만들어 비교하면 원하는 비교가 가능하다.

 

3. 문제에서 '문자'로 반환하라고 했으니 문자로 형변환하여 반환해준다.

return str(int(''.join(numbers)))
728x90
320x100