https://leetcode.com/problems/largest-number/
<문제>
Given a list of non-negative integers nums, arrange them such that they form the largest number.
Note: The result may be very large, so you need to return a string instead of an integer.
<예시>
Example 1:
Input: nums = [10,2] Output: "210"
Example 2:
Input: nums = [3,30,34,5,9] Output: "9534330"
Example 3:
Input: nums = [1] Output: "1"
Example 4:
Input: nums = [10] Output: "10"
이 문제를 통해 얻어간 것
- bubble sort 구현 연습
- 문자간 비교하는 방법에 대한 생각! 💡
- 7과 73을 비교하는 문제를, 773과 737을 비교하는 하는 문제로 바꾸어서 푸는 것
'''
61. 가장 큰 수
항목들을 조합하여 만들 수 있는 가장 큰 수를 출력하라.
https://leetcode.com/problems/largest-number/
'''
from typing import List
# 73과 7을 비교할 때
# "73"+"7"="737", "7"+"73"="773"을 비교하면 된다는 것!
# merge sort 이용한 풀이
class Solution:
@staticmethod
def compare(num1, num2):
if str(num1) + str(num2) > str(num2) + str(num1):
return True
else:
return False
def merge(self, l1, l2):
l1_index = 0
l2_index = 0
sorted_list = []
while l1_index != len(l1) and l2_index != len(l2):
if Solution.compare(l1[l1_index], l2[l2_index]):
sorted_list.append(l1[l1_index])
l1_index += 1
else:
sorted_list.append(l2[l2_index])
l2_index += 1
if l1_index != len(l1):
sorted_list.extend(l1[l1_index:])
else:
sorted_list.extend(l2[l2_index:])
return sorted_list
def divide(self, nums: List[int]):
if len(nums) <= 1:
return nums
mid = len(nums) // 2
left = self.divide(nums[:mid])
right = self.divide(nums[mid:])
return self.merge(left, right)
def largestNumber(self, nums: List[int]) -> str:
ret = self.divide(nums)
ret = ''.join(list(map(str, ret)))
if int(ret) == 0:
return "0"
return ret
'다전공_컴퓨터공학 > 알고리즘 문제풀이' 카테고리의 다른 글
[파이썬 알고리즘] 19장 비트조작 - 싱글 넘버 (XOR의 사용) (0) | 2021.02.22 |
---|---|
[파이썬 알고리즘] 17장 - 색 정렬 (leetcode 75) - 3 pointer 문제 (0) | 2021.01.29 |
[프로그래머스] 그래프 - 순위 (0) | 2021.01.22 |
[파이썬 알고리즘] 14장 - pre/in-order traversal (leetcode 105) - 재귀 (0) | 2021.01.22 |
[파이썬 알고리즘] 14장 - BST 노드 간 최소 거리 (leetcode 783) - traversal 👍 (0) | 2021.01.22 |