[프로그래머스 코테 연습] 가장 큰 수

Gorae·2021년 6월 17일
0

알고리즘

목록 보기
15/19
post-thumbnail

문제 요약

주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210이다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return하라.

답안 예시

def solution(numbers):
    num = list(map(str, numbers))

    # x*3 은 문자열을 3번 반복하는 것.
    # [“6”, “10”, “2”] 라면 666, 101010, 222가 됨.
    # numbers의 원소가 1000 이하로 주어지므로, 3자리 수로 맞춰서 비교하는 것.
    num.sort(key = lambda x: x*3, reverse= True)
   
    # int 변환 후 str 변환을 함으로써, 모든 값이 0일 때 '000' 등을 0으로 만든다.
    return str(int("".join(num)))

느낀점

  • heapq, deque, permutations,... 여러 방법을 시도했으나 계속 시간 초과가 났는데, 주어진 배열 원소의 최대 길이를 이용하는 것이 핵심 아이디어였다!
  • x*2 를 하면 안 되는 이유는, 99, 995일 경우 문자열 비교를 하더라도 995가 더 큰 수로 판별되기 때문. 만약 10,000 이하로 주어졌다면, x*4를 하면 되겠지.
  • 문자열 비교는 아스키 코드 값으로 치환된 후 치러진다.

    예시) [“6”, “10”, “2”]
    666, 101010, 222의 첫 번째 인덱스 값으로 비교.
    첫 번째 인덱스가 같다면 두 번째 인덱스로 비교가 넘어간다.
    여기서는 6=86, 1=81, 2=82 이므로 6>2>1 순이 됨.

profile
좋은 개발자, 좋은 사람

0개의 댓글