[programmers] 가장 큰 수

Gomao·2023년 3월 21일
0

코딩테스트 준비

목록 보기
13/20

프로그래머스 Lv.2 가장 큰 수

아이디어가 99.9999% 인 문제이다.

문제 분석

0 또는 양의 정수가 잠긴 배열 numbers에 담긴 수를 재배치하여
만들 수 있는 가장 큰 수를 문자열로 return 해야 한다.

여기서 주의해야 할 점은, 34,33,32,31,30,3 과 같은 경우 
34-33-3-32-31-30 순으로 배치해야 한다.

핵심 아이디어

위의 경우를 완벽하게 포함하는 정렬 방식을 구상해야 한다.
조금 직관적으로 분석하기 위해서
333, 34, 33, 32, 30, 3 의 경우를 비교해보면,
1. 3, 33, 333은 순서가 상관 없다.
2. 34가 가장 먼저 와야 한다.
3. 3은 32,30보다 먼저 와야 한다.
4. 그 외의 경우는 단순히 크기 순으로 배치하면 된다.

이 조건을 만족하려면, numbers의 원소가 0~1000 사이의 값이므로
자릿수가 1인 수를 제대로 비교하기 위해서는 문자열을 3번 반복해야 한다.
-- 34, 3, 32, 30의 경우 : 343434, 333, 323232, 303030

이 경우 숫자가 아닌 문자열로 ASCII code 순서에 따라 정렬하게 되면
첫 번째 자리는 3으로 모두 같고, 두 번째 자리 순서대로 배열을 하게 되어
333이 323232보다 앞에 오게 된다.

※ numbers의 원소의 자릿수가 n자리라면, 문자열을 n-1번 반복해야 한다.

제출한 코드
사실 아이디어가 99.9999%인 문제이다.

def solution(numbers):
    arr = [str(x) for x in numbers]                     
    arr = sorted(arr,reverse=True,key=lambda x : x*3)

    return str(int("".join(arr)))
1. arr을 문자열 형태로 다시 배열에 담고,
2. 1자리수를 올바르게 배치하기 위해 문자열을 3회 반복한 기준으로 정렬한다.
3. 마지막으로 "".join(arr)을 해주어 리스트를 문자열로 합쳐준다.
4. 이때, numbers의 모든 원소가 0인 경우
   -----> 문자열 "00..000"이 출력될 수 있으므로
5. int()를 사용해서 한번 정수형으로 변경해준 후,
6. 다시 str()을 사용해서 문자열로 변경해주면 예외처리가 완료된다.

다른 사람의 풀이

import functools

def comparator(a,b):
    t1 = a+b
    t2 = b+a
    return (int(t1) > int(t2)) - (int(t1) < int(t2))

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
import functools 은 처음본다!!
JavaScript의 reduce 메서드와 같다고 보면 되는 듯 하다.
lambda x 대신 새로운 함수를 부여하는 방법인 듯 하다!

key = lambda x : x

key = functools.cmp_to_key(lambda a,b: -1 if a+b > b+a else 1)
 ------> 내림차순 정렬하되, a+b > b+a 이면 순서를 바꿔라(??)

사용법을 익혀두면 좋을 것 같다.
만약 내가 JavaScript로 이 문제를 풀었다면 이렇게 풀려고 했을 텐데,
python에서 사용하는 방법을 모르고 있었다!

import functools

추후 추가 정리
profile
코딩꿈나무 고마오

0개의 댓글