[Python] 프로그래머스 가장 큰수 (sort(key = , lambda , reverse = True))

민갱·2023년 6월 25일

CT

목록 보기
16/35

가장 큰수

  answer = ''
    strL = [str(num) for num in numbers]
    strl = list(map(str,numbers))
    strL.sort(key=lambda num: num*3, reverse=True) 
    strL.sort(key=lambda num: (num*4)[:4], reverse=True) 

    answer = str(''.join(i for i in strL))

    # l = ['3','30','341','4','34']
    # l2 = ['333','303030','341341341','444','343434','31']
    # l.sort()
    # l2.sort()
    # print(l2)
   return answer 

중요 포인트

  • str로 형 변환 후, 사전 값으로 배열을 정렬.
  • str로 변경한 숫자에 3을 곱한 값으로 재정렬.
  • 반환 해줄 때, int로 변환을 해준 후 다시 str로 변경.
    • 0000이 나왔을 경우 0000이 아니라 0 이여야 하기때문에 int로 반환 후 다시 str로 변환

3을 곱하는 이유는 2번째 예시를 풀 때 이유를 알게 된다.
계산할 때 사전값으로만 정렬을 한다면 [9,5,34,30,3] 이렇게 정렬된다.
하지만 3이 30보다 앞에 와야한다.
number는 1000이하의 숫자이므로 최대값을 생각해 3을 곱해줬고,

==> 1000보다 작기때문에 문자를 동일하게 3번 붙여서 문자 기준으로 정렬을 했다. 그래서 아래처럼 비교를 하면
3을 곱하게 되면 [999, 555, 343434, 303030, 333] 이렇게 될 것이고, 정렬을 하게 되면 [999, 555, 343434, 333, 303030]이 된다.

1. sort() & sorted()

1. sorted()

  • sorted() 내장 함수는 파이썬에서 순회가 가능한(iterable) 객체를 인자로 받아 데이터를 정렬해줄 수 있다.
>>> sorted([3, 5, 2, 1, 4])
[1, 2, 3, 4, 5]
>>> sorted(["D", "A", "C", "B", "E"])
['A', 'B', 'C', 'D', 'E']

sorted()의 key 1.

  • sorted() 내장 함수는 인자로 넘어온 객체의 원래 순서를 건드리지 않고 정렬된 원소들을 새로운 객체에 담아서 반환해줍니다.
>>> nums = [3, 5, 2, 1, 4]
>>> sorted_nums = sorted(nums)
>>> print(nums)
[3, 5, 2, 1, 4]
>>> print(sorted_nums)
[1, 2, 3, 4, 5]

sorted()의 key 2.

  • 파이썬에서는 리스트(list) 뿐만 아니라, 튜플(tuple), 세트(set), 문자열(string)과 같은 다른 자료형도 순회가 가능한데,
  • 따라서 이러한 자료형의 인자와 함께 sorted() 함수를 호출할 수 있으며 이 때 주의할 점은 입력 자료형과 무방하게 항상 리스트가 반환된다는 것입니다.
>>> sorted((3, 5, 2, 1, 4))
[1, 2, 3, 4, 5]
>>> sorted({3, 5, 2, 1, 4})
[1, 2, 3, 4, 5]
>>> sorted("35214")
['1', '2', '3', '4', '5']

정렬이후 리스트를 문자열로 만드려면 join() 이용.
+a
>>> ''.join(sorted("35214"))
'12345'

sorted()의 key 3.

  • sorted() 함수를 사용할 때는 입력 인자에 들어있는 원소 간에 반드시 논리적으로 비교가 가능해야(comparable)한다는 것을 알 수 있습니다.

>>> sorted(["2", 1])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'str'


>>> nums = [3, 5, 2, None, 1, 4]
>>> sorted(nums)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'NoneType' and 'int'

>>> sorted([num for num in nums if num])
[1, 2, 3, 4, 5]

sorted()의 key 4.

>>> countries = [
  {'code': 'KR', 'name': 'Korea'},
  {'code': 'CA', 'name': 'Canada'},
  {'code': 'US', 'name': 'United States'},
  {'code': 'GB', 'name': 'United Kingdom'},
  {'code': 'CN', 'name': 'China'}
]

>>> sorted(countries)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'
  • 이 배열을 그대로 sorted() 함수에 인자로 넘기면 위에서 설명드렸던 문제가 발생한다. 논리적으로 사전 간에 대소 비교를 할 수가 없기 때문이다.
  • 정렬 기준을 설정하려면 sorted() 함수의 key 옵션을 사용해야하는데, key 옵션에 함수를 지정하면 각 원소에 이 함수를 호출한 결과를 기준으로 대소비교를 하게된다.

예를 들어, 국가 코드를 기준으로 정렬하면 코드를 기준으로 영국(GB)이 한국(KR) 앞에 오게 된다.
>>> sorted(countries, key=lambda country: country["code"])
[
	{'code': 'CA', 'name': 'Canada'},
    {'code': 'CN', 'name': 'China'},
    {'code': 'GB', 'name': 'United Kingdom'},
    {'code': 'KR', 'name': 'Korea'},
    {'code': 'US', 'name': 'United States'}
 ]


국가 이름을 기준으로 정렬을 해보면,
이 기준으로는 한국(Korea)이 영국(United Kingdom)보다 앞에 오는 것을 볼 수 있다.

sorted(countries, key=lambda country: country["name"])
[
	{'code': 'CA', 'name': 'Canada'},
    {'code': 'CN', 'name': 'China'},
    {'code': 'KR', 'name': 'Korea'},
    {'code': 'GB', 'name': 'United Kingdom'},
    {'code': 'US', 'name': 'United States'}
]
  • key 옵션은 서로 다른 자료형의 데이터를 정렬할 때도 활용할 수 있다.
    위에서 숫자와 문자가 들어있는 배열과 함께 sorted() 함수를 호출했을 때 < 연산자가 지원되지 않아서 오류를 해결할 수 있다.

  • 하지만 key 옵션에 int 함수를 넘기면 모든 데이터가 숫자로 취급되어 비교되기 때문에 정렬이 가능해질 것이다.

>>> sorted(["2", 1], key=int)
[1, '2']

2. sort()

sort()의 key 1.

  • 리스트의 sort() 함수를 호출하면 새로운 리스트를 생성하지 않고 기존 리스트 내의 원소 간에 순서를 바꿔서, 소위 in-place 정렬해주는데,
  • 자연스럽게 sorted() 내장 함수처럼 새로운 리스트를 반환해줄 필요가 없으므로 sort() 함수는 항상 None을 반환한다.

sort()의 key 2.

  • sort() 함수는 원본 데이터의 순서를 그대로 보존해야하는 상황에서 쓰면 데이터 순서가 틀어져서 난감해질 수 있다.
  • 리스트의 sort() 함수는 sorted() 내장 함수 대비 메모리 사용량 측면에서 유리하다. sorted() 함수처럼 입력 데이터와 동일한 크기의 리스트를 새로 만들 필요가 없기 때문이다.

이러한 차이점을 제외하고는 sort() 함수를 호출할 때도 reverse와 key 옵션을 동일한 방법으로 사용할 수 있다.

예를 들어, 양수와 음수가 섞여 있는 리스트를 절대값 기준으로 내림차순 정렬하면

>>> nums = [-3, 5, -2, -1, 4]
>>> nums.sort(reverse=True, key=abs)
>>> print(nums)
[5, 4, -3, -2, -1]
profile
가보자고

0개의 댓글