가장 큰 수 (Programmers 42746)

문파이더맨·2021년 5월 4일
0

Algorithm

목록 보기
11/58

🧑‍💻 문제

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"

🧑‍💻 해결방법

  • lambda 함수를 사용해서 정렬해주기.
  • lambda 함수에 대해 익히는 것이 가장 중요하다.

🧑‍💻 코드

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x * 3, reverse=True)

    return str(int(''.join(numbers)))

🧑‍💻 코드설명

  • lambda 함수가 들어갈 때 3을 곱해주는 이유는 문제에서 원소가 1,000 이하의 숫자라고 했기 때문이다.
  • 예를 들어 원소가 10의자리 숫자인 경우에 2를 곱해주게 된다면 1000의 자리 숫자가 된다. ex) 12 * => 1212
  • 그렇기 때문에 최소 3은 곱해주어야 정렬을 할 때 맨 앞에서부터 진행되니 비교가 가능해지기 때문이다.
  • 마지막에 str(int()) 를 해준 이유는 원소가 전부 0인 리스트가 된다면 출력 자체는 0 하나만 나와야하는데 문자열로 붙여주게 된다면 0000 이런식으로 나타나게 될 것이다.

🧑‍💻 총평

  • 문제를 고민하는데 한참이었다.
  • 처음에는 원소마다 숫자로써 비교를 해주려했으나, 유레카처럼 그냥 정렬해서 내림차순하면 되잖아? 라는 생각이 들었다.
  • 그런데 그 때, 두번째 케이스에서 오류가 발생해서 이건 아니겠구나싶었다.
  • 또한, 맨 앞자리가 겹치는 숫자들을 하나하나 비교해주면 쓸데없는 시간 낭비가 생길 것이라는 예감이 들었다.
  • 결국 구글링을 통해 lambda 함수의 사용법을 익혔다.
  • 여기서 또 하나의 발견은 전에 사용했던 join이다. for문을 통해서 빈 문자열에 하나하나 붙여주려했으나 결국 이 과정도 시간복잡도를 늘리는 셈이 된다. 그래서 return 값에 추가해주니 오히려 깔끔해졌다!
  • 아직 배워야하고 알아야하고 익숙해져야할 파이썬의 함수가 많다. 하나하나 배워야하나 라는 생각이 들 수도 있겠지만 내가 전부 흡수한다고 생각하면 나에겐 정말 큰 이득이 아닐 수 없다! 포기하지말고 증진!
profile
Sever 개발할래요.

0개의 댓글