엔지니어 규의 IT 프로그래밍 다이어리

프로그래머스 : 정렬 - 가장큰수 본문

코딩테스트/python

프로그래머스 : 정렬 - 가장큰수

엔지니어 규 2023. 1. 15. 19:43
728x90

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

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

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

제한 사항

 

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

 

 

풀이 1

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

 

1. list(map(str,numbers)) 를 이용해서 numbers 의 모든 원소를 str 로 바꿔준다.

 

2. 가장 핵심 idea 가 'key = lambda x: x*3' 의 역순으로 정렬하는것이다.

   

[3,30,34,5,9]를 (key = lambda x: x[0]) 으로 정렬하면 [9,5,34,30,3] 이 나온다.

 

하지만 30,3 을 정렬해야 할 필요가 있으므로 ['333','303030','343434','555','999'] 이런식으로 만든다.

 

3. 마지막에 ['0','0','0'] 같은경우 0이나와야 하므로 숫자로 바꾼후 다시 str 로 바꾼다.

 

4. 문자열인 숫자를 정렬할때 숫자를 '크기'로 보지않고 '순서' 로 본다. 예를 들면 내림차순으로 정렬할때

 

'99' 가 '101' 보다 위에 있으며,  '101' 보다 '10' 이 아래에 존재한다. 

 

 

사실상 '구현' 보단 idea에 따른 풀이 이기 때문에 생각못한다면 다른 방식으로 구현할 수 있어야 한다.

 

풀이2

import functools
 
def comparator(a,b):
    t1 = a+b
    t2 = b+a
    return (int(t1) > int(t2)) - (int(t1) < int(t2)) #  t1이 크다면 1  // t2가 크다면 -1  //  같으면 0
 
def solution(numbers):
    n = [str(x) for x in numbers]
    n = sorted(n, key=functools.cmp_to_key(comparator),reverse=True)
    answer = str(int(''.join(n)))
    return answer
cs

 

1. functools 관련 내용

 

python 조건 정렬 하기! cmp_to_key()

정렬과 관련된 문제를 풀다보면 특정 조건으로 정렬을 시켜야 하지만, 그게 잘 안될 때가 있다. 그러다 찾은 방식이 바로 cmp_to_key 를 이용하는 것이다.아래 설명은 내가 이해한 정도의 지나지 않

velog.io

 

cmp_to_key() 를 활용하는 방법이 있는데 이것 역시 해당 Tool 을 알아야 한다는 단점이 있다.

사실 완벽하게 이해를 하진 못한것같다.

 

 

 

728x90
Comments