알고리즘 풀이/프로그래머스

[Level 2] 가장 큰 수

mhko411 2021. 2. 20. 20:16
728x90

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

입력
0 또는 양의 정수가 담긴 배열 numbers가 입력된다.

출력
순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 출력한다.


접근

처음에 numbers에 담긴 숫자들을 문자형으로 바꾸고 리스트에 저장 한다음에 내림차순으로 정렬하여 출려하면 될 줄 알았지만 예외 케이스가 많았다.

먼저 34, 30, 3으로 정렬이 되었고 이대로 출력하면 34303이되어 가장 큰 수인34330이 나오지 않는다.

따라서 현재 문자와 다음 인덱스의 첫 글자가 같을 때 현재 문자의 두 번째 글자가 0이면 스왑을 해주었는데 입력되는 수는 1000이하였기 때문에 한계가 있었다.

 

이를 해결하는 것이 문자형으로 변경된 리스트의 각 원소들에 x3을 해주는 것이다. 문자에 x 연산을 하면 해당 문자를 반복하게 되는데 이를 통해 자릿수를 맞출 수 있다. 

 

이후에 만약 0 세 개가 들어온다면 000이 출력되기 때문에 int형으로 변형 후 다시 str로 변형을 시켜줘야 했다.

 

구현

sorted 함수로 numbers를 정렬할 때 key에 lambda를 사용하여 원소들에 x3 후에 비교하도록 하였고 reverse를 True로 하여 내림차순 정렬을 하였다.

그리고 join을 각 원소들을 묶은 후에 0이 00 등으로 나오는 것을 방지하기 위해 int로 변형 후에 다시 str로 변형하였다.

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

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 올바른 괄호  (0) 2021.02.21
[Level 2] 더 맵게  (0) 2021.02.21
[Level 2] 구명보트  (0) 2021.02.20
[Level 2] 전화번호 목록  (0) 2021.02.19
[Level 3] 2xn 타일링  (0) 2021.02.19