본문 바로가기
Programming language/Python

[CodingStudy] 정렬 -가장 큰 수

by jino22 2021. 8. 26.

틀린 부분이 있다면 언제든지 댓글 남겨주세요! 

 

 

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

이 문제는 전혀 다른 방향으로 코드를 짜는 바람에 다른 분들의 코드를 참고하여 다시 공부했다 ㅠㅠ
생각보다 너무 짧아서 놀랐다..파이썬은 참 좋은 언어야..
파이썬 공부를 코드 짤때 그때그때 하다보니까 모르는 함수나 문법이 아직도 많다..ㅠㅠ


 

문제. 0 또는 양의 정수가 담긴 배열 numbers가 주어질 때, 재배치하여 만들 수 있는 가장 큰 수를 문자열로 return

(numbers의 길이는 1 이상 100,000 이하, 원소의 길이는 1,000 이하)

 

ex) [3, 30, 34, 5, 9] > 9534330 / [6, 10, 2] > 6210


def solution(numbers):
	# numbers리스트의 요소 타입을 str로 변경
    numbers=list(map(str,numbers))
	# 요소의 값을 3자리 이상으로 만들어 내림차순 정렬
    numbers.sort(key=lambda x:x*3, reverse=True)
	# 정렬한 요소를 문자열로 합침 > 이때 int형태로 한번 변경하여 0000인 경우 0으로 만들어줌
    string=str(int("".join(numbers)))
    return string

 

핵심은 lambda함수와 조건에서 주어진 요소의 길이가 1,000이라는 것이다.

*lambda함수: 런타임에 생성해서 사용할 수 있는 익명 함수

sort함수에서 key값을 기준으로 내림차순 정렬(reverse=True)하는데 lambda를 이용하여 요소 값을 바꿔 정렬한다.

 

문자열에 곱셈을 해주면 3*3=9가 아니라 3*3=333이 된다.

이 성질을 이용하여 요소의 길이가 1000이하이므로 3을 곱해 문자열의 길이를 세자리 이상으로 만들어준다.

그리고 문자열을 비교하면 전체를 비교하는 숫자와 달리 맨 앞자리부터 비교된다.

그래서 303030과 333을 비교하면 333이 더 큰수로 판단된다.

 

정렬 후, join함수를 이용하여 문자열을 합치고 현재 문자열 형태여서 그대로 return하면 될 줄 알았지만!

[0, 0, 0, 0]인 경우 '0000'으로 출력되기 때문에 int로 한번 형변환 후 str로 형변환하여 return한다.

 

 

 

 

728x90
반응형

댓글