코딩테스트 연습/프로그래머스

[프로그래머스] 가장 큰 수 in python

슈퍼짱짱 2019. 12. 9. 17:26
반응형

파이썬으로 프로그래머스 풀기 :: 가장 큰 수


문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항
  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbersreturn
[6, 10, 2]6210
[3, 30, 34, 5, 9]9534330


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




코드


1
2
3
4
def solution(numbers):
    numbers = list(map(str, numbers))
    answer = "".join(sorted(numbers, key=lambda x: (x[0], x[1%len(x)], x[2%len(x)], x[3%len(x)]),reverse=True))
    return answer if int(answer) != 0 else "0"
cs


numbers를 각 자리수로 정렬하는데, 6처럼 한 자리 숫자는 x[1]이나 x[2], x[3]을 가져올 수 없으므로, 나머지 연산으로 가져온다. 

* 최대 1,000 까지이므로 총 4자리만 확인해주면 된다.


예) [12, 212]

> list(map(lambda x: (x[0], x[1%len(x)], x[2%len(x)], x[3%len(x)]), ["12","121"]))

[('1', '2', '1', '2'), ('1', '2', '1', '1')]


예) [21, 212]

> list(map(lambda x: (x[0], x[1%len(x)], x[2%len(x)], x[3%len(x)]), ["21","212"]))

[('2', '1', '2', '1'), ('2', '1', '2', '2')]


* 이 문제에서 많이 틀리는 반례로는 

[0, 0, 0, 0] -> 0

[12, 121] -> 12121

[21, 212] -> 21221

[999, 9, 998] -> 9999998

정도가 있다.




코드 :: 다른 사람의 풀이


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


string에서는 대소 비교가 일반 숫자랑은 다르기 때문에 가능한 코드이다.


> "3" > "24"

True


> "12"*3 > "121"*3

True


> "212"*3 > "21"*3

True


반응형