프로그래머스

프로그래머스 가장 큰 수 파이썬

hotchya 2021. 9. 8. 20:44

가장 큰 수

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

문제 단순화

  • numbers 라는 정수배열이 있다.
  • 해당 배열의 요소를 이어붙여 만들 수 있는 가장 큰 수를 리턴한다.

문제풀이

  • 배열의 요소를 문자열로 변환한 뒤, 정렬한다.

  • 정렬한 요소를 붙여 리턴한다.

  • 정렬 방법은 다음과 같다.

      1. 자리수가 같은 경우 큰 수가 우선순위가 높다.
    
          ex) 156, 598 -> 598156
          ex) 9,8 -> 98
    
      2. 자리수가 다른 경우 앞 자리가 큰 수가 우선순위가 높다.
    
          ex) 156, 9 -> 9156
    
      3. 한자리 수의 앞자리가 같은 경우, 두자리 수 보다 한자리 수가 우선순위가 높다.
    
          ex) 9, 98 -> 998
    
      4. 한자리 수의 앞자리가 같은 경우, 세자리 수 보다 한자리 수가 우선순위가 높다.
    
          ex) 9, 989 -> 9989
    
      5. 두자리 수의 앞자리가 같은 경우, 세번째 자리수가 첫번째 자리수보다 작으면 두자리 수가 우선순위가 높다.
    
          ex) 87 877 -> 87877
    
      6. 두자리 수의 앞자리가 같은 경우, 세번째 자리수가 첫번째 자리수보다 크면 세자리 수가 우선순위가 높다.
    
          ex) 87 879 -> 87987
    
      7. 두자리 수의 앞자리가 같고, 세번째 자리수와 첫번째 자리수가 같은 경우, 두번째 자리수가 작으면 세자리수가 우선순위가 높다.
    
          ex) 87 878 -> 87887
    
      8. 두자리 수의 앞자리가 같고, 세번째 자리수와 첫번째 자리수가 같은 경우, 두번째 자리수가 크면 두자리수가 우선순위가 높다.
    
          ex) 89 898 -> 89898
    
      - 첫번째 자리에 있는 수로 자리수를 늘린다. (1,2,3,4,5,6,7)
    
      ex) [우선순위(156) < 우선순위(598)] =   "1561" < "5985"     O
      ex) [우선순위(8) < 우선순위(9)]     =   "88"   < "99"       O
      ex) [우선순위(156) < 우선순위(9)]   =   "1561" < "99"       O
      ex) [우선순위(98) < 우선순위(9)]    =   "989"  < "99"       O
      ex) [우선순위(989) < 우선순위(9)]   =   "9899" < "99"       O
      ex) [우선순위(877) < 우선순위(87)]  =   "8778" < "878"      O
      ex) [우선순위(87) < 우선순위(879)]  =   "878"  < "8798"     O
      ex) [우선순위(87) < 우선순위(878)]  =   "878"  < "8788"     O
      ex) [우선순위(898) < 우선순위(89)]  =   "8988" > "898"      X
    
      - 마지막 자리에 있는 수로 자리수를 더 늘린다 (1,2,3,4,5,6,7,8)
    
      ex) [우선순위(156) < 우선순위(598)] =   "15616" < "59858"     O
      ex) [우선순위(8) < 우선순위(9)]     =   "888"   < "999"       O
      ex) [우선순위(156) < 우선순위(9)]   =   "15616" < "999"       O
      ex) [우선순위(98) < 우선순위(9)]    =   "9898"  < "999"       O
      ex) [우선순위(989) < 우선순위(9)]   =   "98999" < "999"       O
      ex) [우선순위(877) < 우선순위(87)]  =   "87787" < "8787"      O
      ex) [우선순위(87) < 우선순위(879)]  =   "8787"  < "87989"     O
      ex) [우선순위(87) < 우선순위(878)]  =   "8787"  < "87888"     O
      ex) [우선순위(898) < 우선순위(89)]  =   "89888" < "8989"      O

코드

def solution(numbers):
    strs = [str(x) for x in numbers]
    strs.sort(key=lambda x : x + x[0] + x[-1], reverse=True)
    answer = "".join(strs)
    return str(int(answer))