[프로그래머스]가장 큰 수-정렬
SW개발/코딩테스트

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

문제 설명

 

def solution(numbers):
    numbers = list(map(str, numbers))
    # x*3을 기준으로 하여 정렬한다.
    # 기준을 삼는 것이기 때문에 실제로 정렬되는 데이터는 *3이 된 것이 아니다.
    numbers.sort(key = lambda x: x*3, reverse=True) 
    return str(int(''.join(numbers)))

 

코드 설명

먼저 입력받은 numbers 리스트를 map() 함수를 통하여 전부 str 형으로 바꿔준다. map object가 되기 때문에 list() 함수를 통하여 리스트 형으로 다시 변환시켜준다. sort() 함수의 key 인자 값을 활용(key 를 기준으로 하여 리스트로 정렬함)하여 내림차순 정렬을 해준다.

join 함수를 활용하여 리스트를 하나로 이어주고 int -> str 형변환을 두번 거친 후 return 하여 준다.

 

Point : 먼저 리스트의 원소들을 전부 str로 바꾸어 주고 str로 크기를 비교할 수 있게 만든다. key 로 x*3 을 이용하는 것이 가장 큰 포인트이다. 문제에서 0~1000 이하의 숫자로 제한사항이 있기에 3자리에 걸 맞게 문자열*3 연산을 이용하는 것이다.

그렇다면 이 연산을 이용하는 이유는 무엇일까? 

 

먼저, *3 연산 대신 뒷 자릿수를 0으로 채워 3자리를 만드는 경우를 생각해 볼 수 있다. 

[999, 9, 998] 가 존재한다면 999, 900, 998이 되고 역순으로 정렬을 하면 999->998->900 즉, 999 998 9 가 된다.

->9999998 이라는 더 큰 숫자가 존재하므로 실패하게 된다.

 

하지만, *3 연산을 이용할 경우 999, 999, 998이 되고 이를 역순으로 정렬하면 999->999->998 즉, 999 9 998 이 된다.

이러한 이유 때문에 *3 연산을 통하여 3자리를 만들어 비교하는 것이다.

 

마지막으로 정렬된 데이터를 join 하여 결합하여 주는데 int 형으로 변환을 하는 이유는 케이스 [0, 0, 0, 0]일 경우 0000이 되기 때문에 이를 0으로 변환해주어야 하기 때문이다.

728x90