코테 공부/프로그래머스

[Python] 가장 큰 수(어려웠음)

prefer_all 2021. 8. 9. 23:02

<문제>

주어진 정수를 이어붙여 만들 수 있는 가장 큰 수 return

* 앞에서부터 값을 비교해야함 (3이 30보다 먼저 나와야함)

 

따라서 아래 코드는 0534303이 return 되므로 틀렸음

def solution(numbers):
    num = []
    num = list(map(str, numbers))
    answer = ''
    max = ''
    temp = ''
    
    for i in range(len(num)-1):
        for j in range(i+1,len(num)):
            if num[i][0] > num[j][0]:
                temp = num[i]
                num[i] = num[j]
                num[j] = temp
            if num[i][0] == num[j][0]:
                num[i:j].sort()
    
    print(num)
    num.reverse()
    print(num)
    for n in num:
        answer += n    
        
    return answer

 

 

* string의 대소비교 : 문자의 경우는 아스키 숫자로 변환되어 맨 앞의 문자부터 비교

>>> '24' < '3'
True

>>> 'ab' < 'z'
True

 


<모범 답안>

 

만약 3, 32, 34의 세 숫자를 가지고 문자열을 만들 때 34332가 return 되어야함

숫자로 따지면 34 > 32 > 3 이지만 3뒤에 숫자가 붙을 수 있음

즉. 3을 33이라고 생각하고 34 > 3 > 32로 정렬하는 게 올바름

 

따라서 string 값 * 3을 해줌 (numbers의 원소는 1~999 사이의 값이고, numbers가 최소 한 자리 수 일 때도 세 자리 수로 늘려주기 위해)

>>> a= '1'
>>> print(a *3)
..
..
111

>> b= '34'
>>> print(b * 3 )
..
..
343434

 

 

def solution(numbers):
    numbers = list(map(str, numbers))
    
    numbers.sort(key=lambda x: x * 3, reverse=True) #key= 주의
    #sort하면 작은 값부터 큰 값 순으로 나열되므로, reverse = True
    
    return str(int(''.join(numbers))) 
    #string으로 반환해야하므로 ''.join()
    #[0,0,0] 처럼 모든 수가 0인 경우 '000'이 아닌 '0'을 반환해야하므로 int로 바꿔준 후 str

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

  각 원소에 3을 곱한 값을 기준으로 numbers를 sorting하고 numbers의 원소값은 그대로임

def solution(numbers):
    answer = ''
    numbers = list(map(str, numbers))
    for i in range(len(numbers)): #이렇게 할 경우
        numbers[i] = numbers[i] *3 
    numbers.sort()
    for num in reversed(numbers):
        answer= answer + num
    return answer
    #실행한 결괏값 "666222101010"이 기댓값 "6210"과 다릅니다.

 

>> a = ['1', '2', '3']
>> for x in a:
>>     x = x*3
>>     print(x)
>>     print(a)

..
..
111
222
333
['1', '2', '3']
>>> a = ['1', '2', '3']
>>> a = (lambda x : x* 3)(a)

>>> print(a)
..
..
['1', '2', '3', '1', '2', '3', '1', '2', '3']

'코테 공부 > 프로그래머스' 카테고리의 다른 글

[Python/완전탐색] 카펫  (0) 2022.08.02
[Python] 행렬의 덧셈  (0) 2022.08.02
[Python] 신고 결과 받기  (0) 2022.06.21
[Python] 정렬/k번째 수  (0) 2021.08.06
[Python/해시] 완주하지 못한 선수  (0) 2021.08.05