https://programmers.co.kr/learn/courses/30/lessons/42746
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
풀이 과정
숫자의 앞자리 수가 큰 순서대로 정답 문자열에 추가하면 될 것 같지만 숫자의 앞자리 수가 같은 숫자를 어떻게 처리할지가 애매하다. 입출력 예 2의 [3, 30, 34, 5, 9]에서 9, 5가 먼저 추가되야 하는것은 명확하지만 3, 30, 34를 34, 3, 30 순서대로 오게 해야할 것 같은데 처리를 어떻게 해줘야 할까?
0 <= numbers 원소 <= 1000임을 이용해서 숫자를 str으로 바꿔주고 *3으로 뒤에 같은 숫자를 붙여준 것을 통해 정렬하면 문제를 해결할 수 있다. 왜 *3인가? *2는 안되는가? 일단 *3의 예시를 생각해보면
[3, 30, 34, 5, 9] -> ['333', '303030', '343434', '555', '999']이고 이를 통해 왼쪽의 리스트를 정렬하면 [9, 5, 34, 3, 30]이 나오므로 이를 문자열로 합쳐주면 우리가 원하는 답을 얻을 수 있다.
[332, 3]을 생각해보자 3332가 이 리스트로 만들 수 있는 가장 큰 문자열이므로 3이 332보다 먼저 와야 한다. *3을 통해 정렬하면
[332, 3] -> ['332332332', '333'] 이므로 [3, 332]로 정렬이 된다. 하지만 *2를 통해 정렬하면
[332, 3] -> ['332332', '33'] 이 되므로 [332, 3]으로 정렬이 되게 된다. 이를 통해 답을 내면 3323이라는 잘못된 답이 나온다.
numbers의 원소가 10000까지 들어온다면 *4를 통해 정렬을 해주어야 할 것이다. 왜인지는 위의 설명과 유사한 반례를 들어 설명할 수 있을 것이다.
[0, 0, 0, 0]등의 input값에서 '0000'이라는 결과를 내는 것을 방지하기 위해 답은 int 타입으로 바꿔주었다가 다시 str로 바꿔주어야 한다.
소스 코드
def solution(numbers):
str_numbers = [str(number) for number in numbers]
str_numbers.sort(key=lambda x: x*3, reverse=True)
return str(int(''.join(str_numbers)))
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 이상한 문자 만들기 [파이썬] (0) | 2022.06.26 |
---|---|
프로그래머스 - 소수 찾기 [파이썬] (0) | 2022.06.25 |
프로그래머스 - 더 맵게 [파이썬] (0) | 2022.06.23 |
프로그래머스 - 기능개발 [파이썬] (0) | 2022.06.22 |
프로그래머스 - 위장 [파이썬] (0) | 2022.06.22 |