[Programmers][python] 18. 문제풀이 실습 (7): 프로그래머스 가장 큰 수

illstandtall·2021년 4월 29일
0

Programmers dev course

목록 보기
19/34
post-thumbnail

오류에 대한 지적이나 질문, 토의 환영합니다. 자유롭게 댓글 남겨주세요!.!


프로그래머스 - 가장 큰 수

프로그래머스 가장 큰 수 문제의 링크입니다.


문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.


제한사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

생각

  1. 주어진 리스트의 값을 활용해 가장 큰 수를 만드는 문제입니다. 내림차순으로 정렬해야겠다는 생각이 들었습니다.

  2. 그러나, 숫자(numbers의 원소)의 길이가 같지 않아 숫자의 크기로는 제대로 정렬이 되지 않습니다.
    그래서 정렬의 key 값을 문자열을 기준으로 정렬해야겠다고 생각했습니다.

  3. 그런데 위의 생각대로 입출력 예제2를 정렬한다면 303033의 정렬 순서가 맞지 않는 것을 알 수 있습니다.

  1. 3은 32보다는 앞에 정렬되어야 하고, 4는 43보다 앞에 정렬되어야 하고, 5는 54보다 앞에 정렬되어야 합니다.
    3과 32 뿐만이 아니고 33과 320 또한 33이 320보다 앞에 정렬되어야 합니다.

  2. 이를 쉽게 구현할 수 있는 방법은 숫자를 거듭해서 쓰는 것입니다.
    숫자는 모두 1000보다 작은, 최대 세 자리 수이므로 3을 333으로 만들면 되므로 3번만 거듭해서 씁니다.


Code (Python)

def solution(numbers):
    numbers.sort(key=lambda x: (str(x)*3), reverse=True)
    answer = ''.join(str(s) for s in numbers)
    return str(int(answer))

시간복잡도

  • list 만들 때: O(N)O(N)
  • 정렬할 때: O(NlogN)O(NlogN)
  • .join()할 때ㅐ: O(N)O(N)

programmers-logo-dark

이 글은 프로그래머스 스쿨 인공지능 데브코스 과정에서 공부한 내용을 바탕으로 정리한 글입니다.

profile
주니어

0개의 댓글