๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/LeetCode

[LeetCode] 179. Largest Number(ํŒŒ์ด์ฌ/python) (with. cmp_to_key)

by chjcoder 2023. 9. 7.

๐ŸŽˆ๋ฌธ์ œ

https://leetcode.com/problems/largest-number/description/

๐ŸŽ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜?

์ •๋ ฌ

1. ์ฒ˜์Œ์—” permutation์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ์ฐพ์•„์„œ ํ’€๋ ค ํ–ˆ๋Š”๋ฐ ํ™•์‹คํžˆ ์ˆœ์—ด์€ ๊ฐœ์ˆ˜๊ฐ€ 10๋งŒ ๋„˜์–ด๊ฐ€๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ธฐ ์‰ฝ๋‹ค.

2. cmp_to_key๋ฅผ ํ™œ์šฉํ•œ ํ’€์ด

 

cmp_to_key()์— ๋Œ€ํ•œ ์„ค๋ช…

from functools import cmp_to_key

def compare(a,b):
	if a > b:
		return 1
	elif a == b:
		return 0
	elif a < b:
		return -1

lst = [1,3,2]

lst = sorted(lst, key=cmp_to_key(compare))
print(lst)

# ๊ฒฐ๊ณผ : [1,2,3]
  • cmp_to_key๋Š” -1,0,1์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.(๋”ฐ๋ผ์„œ compare๋Š” -1,0,1์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.)
    • 1 : ์ฒซ๋ฒˆ์งธ ๊ฐ’(a)๊ฐ€ ๋‘๋ฒˆ์งธ ๊ฐ’(b) ๋ณด๋‹ค ํผ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์ •๋ ฌํ•  ๋•Œ, a๊ฐ€ b๋ณด๋‹ค ์•ž์— ์™€์•ผํ•  ๋•Œ 1์„ return ํ•œ๋‹ค.
    • 0 : ์ฒซ๋ฒˆ์งธ ๊ฐ’(a)๊ฐ€ ๋‘๋ฒˆ์งธ ๊ฐ’(b)์™€ ๊ฐ™์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์ •๋ ฌํ•  ๋•Œ, a์™€ b๊ฐ€ ๊ฐ™์€ ์œ„์น˜์— ๊ทธ๋Œ€๋กœ ์žˆ์–ด์•ผ ํ•  ๋•Œ 0์„ returnํ•œ๋‹ค.
    • -1 : ์ฒซ๋ฒˆ์งธ ๊ฐ’(a)๊ฐ€ ๋‘๋ฒˆ์งธ ๊ฐ’(b)๋ณด๋‹ค ์ž‘์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์ •๋ ฌํ•  ๋•Œ, a๊ฐ€ b๋ณด๋‹ค ๋’ค์— ์™€์•ผํ•  ๋•Œ -1์„ return ํ•œ๋‹ค.

 

  • ๊ฒฐ๋ก  : a,b ๋น„๊ตํ•  ๋•Œ ์ˆœ์„œ ๋ฐ”๊ฟ”์•ผ๋˜๋ฉด 1, ์ˆœ์„œ ์•ˆ๋ฐ”๊ฟ”๋„ ๋˜๋ฉด -1 return
    • a < b ์ผ ๋•Œ, ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด return 1
      • 3 < 1 ์ผ ๋•Œ, ์ˆœ์„œ๋ฅผ ๋ฐ”๊พผ๋‹ค๋ฉด ์ •๋ ฌ์€ [3,2,1] ์ˆœ์„œ๊ฐ€ ๋จ
    • a < b ์ผ ๋•Œ, ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด return -1
      • 3 < 1 ์ผ ๋•Œ, ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉด ์ •๋ ฌ์€ [1,2,3] ์ˆœ์„œ๊ฐ€ ๋จ

 

 

๐Ÿ’ป cmp_to_key()๋ฅผ ํ™œ์šฉํ•œ ์ •๋‹ต ์ฝ”๋“œ

from functools import cmp_to_key

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        def compare(a,b):
            if a+b < b+a:
                return 1
            else:
                return -1
        
        nums = list(map(str,nums))
        nums = sorted(nums, key=cmp_to_key(compare))
        return str(int(''.join(nums)))

 

 

โŒpermutation์„ ํ™œ์šฉํ•œ ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ

from itertools import permutations
class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        max_num = 0
        for lst in permutations(map(str,nums),len(nums)):
            num = ''.join(lst)
            max_num = max(int(num),max_num)
        
        return str(max_num)