프로그래머스 level 2 가장 큰 수, 정렬
17 Oct 2021 | 기초 프로그래머스 TIL문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 조건
numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers | return |
---|---|
[6,10,2] | [3,30,34,5,9] |
"6210" | "9534330" |
사고 과정
앞자리를 비교해서 큰 순서대로 새 리스트에 넣어주고 앞자리가 같은 경우에는 전체 숫자를 비교해서 큰 순서대로 넣어준다.
def solution(numbers):
arr={}
answer = []
#맨 앞 숫자를 따서 큰 순서대로 답에 넣어주고 후보리스트에서 제거
for number in numbers:
arr.append(number,(str(number)[0]))
answer.append(max(arr))
numbers.remove(int(max(arr)))
#숫자가 같으면 나머지 전체 숫자를 크기대로 정렬해서 답에 넣어주기
if numbers.count(str(number[0])) > 1:
numbers = sorted(numbers, reverse=True)
answer.append(max(arr))
numbers.remove(int(max(arr)))
answer.join('')
return answer
solution([3,30,34,5,9])
이렇게 짜니까 어떤 수가 어떤 수의 앞자리인 지 알 수 있어야해서 {맨 앞자리수 : 원래 숫자} 이런 식으로 딕셔너리로 리스트에 넣어줘야할 것 같았다.
그렇게 하지 않고 숫자의 크기를 비교할 수 없을까 생각하다가 검색을 해봤는데 다들 숫자가 최대 3자리 수라는 점을 이용해서 원래 숫자를 세 번 반복한 뒤에 문자열끼리 비교하면 아스키코드값에서 첫번째 인덱스 값으로 비교한다는 점을 이용해서 숫자의 크기를 비교하는 방법을 사용한 것을 볼 수 있었다.
def solution(numbers):
answer = []
new_nums =[]
for num in numbers:
new_nums.append(str(num)*3)
new_nums = sorted(new_nums, reverse=True)
print(new_nums) # ['999', '555', '343434', '333', '303030']
for number in new_nums:
answer.append(str(number)/3)
return answer
solution([3,30,34,5,9])
그렇게 혼자 코드를 짜보려고 했는데 3번 반복해서 썼던 수를 다시 원래대로 돌릴 수가 없었다..!
제출 답안
def solution(num):
num = list(map(str, num))
num.sort(key = lambda x : x*3, reverse = True)
return str(int(''.join(num)))
그래서 다른 블로그에 쓰인대로 람다를 사용했다.
개발개발 울었다에 나와있는 설명을 참고하자면 아래와 같다.
- int형의 list를 map을 사용하여 string으로 치환한 뒤, list로 변환한다.
- 변환된 num을 sort()를 사용하여 key 조건에 맞게 정렬한다.
- lambda x : x3은 num 인자 각각의 문자열을 3번 반복한다는 뜻이다. x3을 하는 이유? -> num의 인수값이 1000 이하이므로 3자리수로 맞춘 뒤, 비교하겠다는 뜻. 이 문제의 핵심이라고 할 수 있다.
- 문자열 비교는 ASCII 값으로 치환되어 정렬된다. 따라서 666, 101010, 222의 첫번째 인덱스 값으로 비교한다. 6 = 86, 1 = 81, 2 = 82 이므로 6 > 2 > 1순으로 크다.
- sort()의 기본 정렬 기준은 오름차순이다. reverse = True 전의 sort된 결과값은 10, 2, 6이다.
- 이를 reverse = True를 통해 내림차순 해주면 6,2,10이 된다. 이것을 ‘‘.join(num)을 통해 문자열을 합쳐주면 된다.
- int로 변환한 뒤, 또 str로 변환해주는 이유? 모든 값이 0일 때(즉, ‘000’을 처리하기 위해) int로 변환한 뒤, 다시 str로 변환한다. 출처 : 개발개발 울었다