알고리즘(정렬)-2022.01.11

Jonguk Kim·2022년 1월 11일
0

알고리즘

목록 보기
6/7

1. 가장 큰 수

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

2. 문제 접근 및 해결책

  1. int형의 list를 map을 사용하여 string으로 치환한 뒤, list로 변환한다.
  2. 변환된 numbers를 sort()를 사용하여 key 조건에 맞게 정렬한다.
    • lambda x : x * 3은 numbers를 인자 각각의 문자열을 3번 반복한다는 뜻이다.
    • x * 3을 하는 이유?
      num의 인수값이 1000 이하이므로 3자리수로 맞춘 뒤, 비교하겠다는 뜻.
  • 문자열 비교는 ASCII 값으로 치환되어 정렬된다.
    따라서 666, 101010, 222의 첫번째 인덱스 값으로 비교한다.
  • sort()의 기본 정렬 기준은 오름차순이다. reverse = True 는 내림차순
  • ‘‘.join(num)을 통해 문자열을 합쳐주면 된다.
    • int로 변환한 뒤, 또 str로 변환해주는 이유?
      모든 값이 0일 때(즉, ‘000’을 처리하기 위해) int로 변환한 뒤, 다시 str로 변환한다.
def solution(numbers):
    # list(map(함수, 리스트)) : map 은 리스트의 요소를 지정된 함수로 처리해주는 함수
    # int 형 리스트를 문자열 리스트로 처리
    numbers = list(map(str, numbers))

    # key 조건에 맞게 정렬
    # x*3: 인수값이 1000 이하이므로 3자리수로 맞춘 뒤, 비교
    # 666, 101010, 222의 첫번째 인덱스 값으로 비교하여 내림차순 정렬 (6 > 2 > 1)
    numbers.sort(key=lambda x: x*3, reverse=True)

    # join 을 통해 문자열 합침
    # 000 처리를 위해 int 변환 후 str 변환
    return str(int(''.join(numbers)))
profile
Just Do It

0개의 댓글