Coding Test/Sorting

[Sorting] 가장 큰 수

byunghyun23 2023. 9. 7. 22:59

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

numbers가 [6, 10, 2]일 경우 원소값이 정수이기 때문에 오름차순 정렬하게되면 10, 6, 2를 얻게됩니다.

따라서, 먼저 떠오른 아이디어는 "문자열로 변경 후 정렬하면 되지 않을까?"였습니다.

 

def solution(numbers):
    answer = ''
    
    numbers = sorted(map(str, numbers), reverse=True)
    answer = ''.join(n for n in numbers)
    
    return answer

하지만 테스트2 같은 경우에, '3'과 '30'의 순서가 맞지 않았습니다.

역시 쉽게 풀 수 있는 문제가 있을리가 없죠..

 

[3, 30, 34]라는 값이 있을 때, 결과가 [34, 3, 30]이 될 수 있도록 해야합니다.

처음에는 3과 30의 자리를 바꾸기위해 자릿수를 맞추고 아스키코드를 이용하면 되지 않을까 했지만, '0'보다 크고 '4'보다는 작아야 하는 값은 '1', '2', '3'이고 이것은 숫자 자체로도 사용될 수 있기때문에 이 방법으로는 불가능했습니다.

 

다른 사람의 풀이를 참조한 코드는 아래와 같습니다.

def solution(numbers):
    answer = ''
    
    numbers = sorted(map(str, numbers), key = lambda x: x * 4, reverse=True)
    answer = ''.join(n for n in numbers)
    
    return str(int(answer))

[3, 30, 34]을 정렬할 때, 각 원소를 4번씩 반복하여(최대입력 4자리) 비교하는 방법입니다. 

4번씩 반복하면, [3333, 30303030, 34343434]이 되고 정렬하면 [34343434, 3333, 30303030]이 되며 원래 값으로 보면 [34, 3, 30]이 됩니다.

이것을 numbers = sorted(map(str, numbers), key = lambda x: x * 4, reverse=True)으로 만들 수 있습니다.

 

추가로 numbers가 [0, 0]일 경우, 반환값은 '00'이 됩니다. 따라서 str(int(answer))을 통해 불필요한 '0'을 제거해서 최종 반환할 수 있도록 해야 모든 케이스를 통과할 수 있습니다.

'Coding Test > Sorting' 카테고리의 다른 글

[Sorting] H-Index  (0) 2023.09.08