[프로그래머스] 가장 큰 수 문제풀이 python

mauz·2022년 6월 2일
0

🐒 문제

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

✍ 풀이

def solution(numbers):
    numbers = [str(i) for i in numbers]     # numbers 요소 문자열화
    numbers.sort(key=lambda x: x*3, reverse=True)   # 정렬기준 : 요소*3
    
    return str(int(''.join(numbers)))	# '000' 따위의 경우를 0으로 만들기 위해 정수화 시킨다음 다시 문자열화 하여 출력

참고한 블로그 https://huidea.tistory.com/4


🧠 문제 이해

문자열형태의 숫자의 정렬을 이해하는데 도움을 주는 문제이다.

문자열 형태의 숫자 정렬은 기본적으로
아스키 코드의 대소를 비교한다.

'0' 은 48
'9' 는 57

그런데 자릿수가 두자리수 이상일때는
맨처음 문자부터 대소비교를 하고 다음자리로 넘어서 비교하고를 반복한다.

numbers.sort(key=lambda x: x*3, reverse=True)

key를 통해 정렬기준을 요소*3으로 요소를 세자리수 이상으로 만들어 비교한다.

세자리수 이상으로 만드는 이유는 numbers의 요소의 크기는 1000 미만이므로 999가 최대인데,

만약 3, 300 을 처리할때
3300 또는 3003 이 나오고, 3300을 선택해야한다.

맨 앞자리가 같을떄, 자릿수가 적은 것이 많은 것보다 앞에 있어야한다.

요소*3으로 자릿수를 늘려주면

'333' '300300300'인데 이 문자열을 비교하면

'333' > '300300300' 이 된다.


str(int(''.join(numbers)))

join함수를 통해 정렬된 numbers 리스트를 하나의 문자열로 합쳐준다.

int함수로 정수화를 시켜주는 이유는 입력이 '0','0','0' 일때

'00000' 으로 처리되는데 이를 '0'으로 표시하기 위해

정수로 만들어 0으로 만들고 다시 str로 문자열화 시켜 리턴한다.


처음 풀이(시간초과)

from itertools import permutations

def solution(numbers):
    answer = 0

    snums = [str(i) for i in numbers]

    arr = list(permutations(snums, len(snums)))

    for i in arr:
        answer = max(answer, int(''.join(i)))

    return str(answer)

요소들을 정수로 만들어 만들어질 수 있는 모든 경우의 수를 만들고, 그중 최대값을 출력하는 코드이다.

문자열 상태에서 비교하면 모든 경우의 수를 비교하지 않아도 된다.


후기

어렵다.

람다식에 대해서 공부해야할 것 같다.

문자열 다루는 방법에 익숙해지고싶다.

profile
쥐구멍에 볕드는 날

0개의 댓글