이숭간 공부기록

[프로그래머스] 파이썬 _ 가장 큰수 본문

알고리즘/프로그래머스

[프로그래머스] 파이썬 _ 가장 큰수

이숭간 2021. 6. 5. 15:49
728x90

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

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

 

문제유형 : 정렬

문제풀이 :

  • 문자열 길이를 3배로 늘린 후에 비교하는 방식 ( 원소가 1000이하이므로 ) - 핵심 아이디어 
    • 문자열에서의 대소비교와 일반숫자의 대소비교가 다르기때문에 가능한 코드
    • 문자열 비교연산의 경우에 문자열 첫번째 인덱스를 아스키숫자로 바꿔서 비교하고, 같으면 그 다음 인덱스를 비교하기때문에 숫자비교와는 다르다.
    • 예를들어 '121'과 '12'의 경우 12가 더 먼저와야 큰수를 만들 수 있는데,  문자열 비교에서 '121121121'과 '121212'가 더 큰수이기 때문이다.
    • 마지막에 문자열을 -> 정수 -> 문자열로 반환하는 이유는 '00'을 '0'으로 반환하기 위함

제일 설명을 잘하신 블로그 부분 발췌했습니다

출처 : https://huidea.tistory.com/4

 

가령 [3,300,31,387] 라는 숫자 리스트가 있다면 가장 큰 조합은 --> 387 3 31 310 이다. 

가장 작은 수가 3 이더라도, 첫째자리 숫자 "3"은  310 31 의 두번째 자리 숫자 "1" 보다 크기 때문에, 3은 310 31 보다 앞에 나온다. 

또 31은 31의 두번째 자리숫자 "1" 이 310 의 세번째 자리 숫자 "0" 보다 크기 때문에, 310 보다 앞에 나온다. 

3 >31, 310 31 >310
3 
31
310
31
310

따라서 비교 하는 숫자들의 자리수를 맞춰?서 비교를 해보기 위해 문자열 곱셈을 하여 숫자의 길이를 늘렸다. 

3 ----> 3 3 3
3 -->  3 1 3 1 3 1
310 -> 3 1 0 3 1 0 3 1 0

 

3번씩 써서 늘리는 이유는 문제 조건에서 입력되는 숫자의 최대 크기가 1000미만이라 제시했기 때문이다.

따라서 입력되는 숫자의 최소길이는 1자리 최대길이는 3자리 일것이고, 1자리 숫자를 3자리로 불려줌으로써 

문자형태의 숫자를 대소비교한다.

 

정답코드

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