[프로그래머스] 가장 큰 수 - 정렬 key, lambda

zunzero·2022년 9월 10일
0

알고리즘(파이썬)

목록 보기
45/54

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

아이디어를 떠올리는 데에는 큰 시간이 걸리진 않았지만, 코드로 구현하는 데 있어 시간을 많이 잡아먹은 문제이다.

우선 간단하게 numbers를 앞자리가 큰 수가 오도록 하여 정렬해야겠다는 생각이 든다.
int 상태로 정렬을 하게 되면 10이 6보다 크게 되지만, 우리가 원하는 것은 6이 10보다 앞에 오는 것이다.
따라서 numbers의 각 원소들을 str()메서드를 통해 문자열로 바꿔 정렬해야한다.
그렇게 되면 앞자리부터 비교하기 때문에 6, 2, 10 순으로 정렬이 된다.

문제는 두번째 예제의 3과 30이다.
우리는 9, 5, 34, 3, 30 순으로 정렬되길 바라지만, 위와 같은 방식으로 정렬을 시도하게 되면 9, 5, 34, 30, 3으로 정렬이 된다.
그래서 우리는 3과 30을 비교하기 위해 각 수를 3번씩 곱해서 처리해줄 것이다.
문제의 조건 중, numbers의 원소는 0이상 1000이하라는 문구가 있기 때문에 가능한 비교이다,
모든 원소를 3번씩 곱해서, 그 값을 정렬의 기준으로 사용하는 것이다.
이를 가능케하는 것이 파이썬의 정렬 key이다.

def solution(numbers):
    answer = ''
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)

    return str(int(''.join(numbers)))

정답 코드는 위와 같다.

lambda 매개변수: 표현식

sort는 key로 함수를 받는다.
lambda는 함수를 간단히 표현하기 위한 것이다.

map(함수, 리스트)
list(map(lambda x: x**2, range(5)))
# [0, 1, 4, 9, 16]

filter(함수, 리스트)
list(filter(lambda x: x<5, range(10)))
# [0, 1, 2, 3, 4]
list(filter(lambda x: x%2, range(10)))
# [1, 3, 5, 7, 9]

1은 참, 0은 거짓이다.
lambda x: x%2에 대해서 나머지가 0인 값은 거짓이므로 걸러지고,나머지가 1인 값은 참으로 판별나 list에 담기게 된다.

profile
나만 읽을 수 있는 블로그

0개의 댓글