<문제>
주어진 정수를 이어붙여 만들 수 있는 가장 큰 수 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 |