코딩테스트 고득점 Kit - 정렬 문제


✔️ 문제 설명

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

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

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

제한 사항

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

입출력 예

numbers return
[6, 10, 2] “6210”
[3, 30, 34, 5, 9] “9534330”


✔️ 문제 풀이

(1) Pseudo-Code

1. 숫자형 요소를 문자형으로 바꿔준다. (List comprehension)
2. 각 요소에 3을 곱한 기준으로 정렬한다.
3. join으로 합쳐준다.

(2) 코드 작성

def solution(numbers):
    # 숫자를 문자열로 바꿔줌
    number = [str(num) for num in numbers]

    # 원소 범위 0 이상 1000 이하, 3자리수 처리
    # 만약, 앞자리가 같은 문자가 있다면 명확한 순서 비교를 위해 3자리수 처리
    # ex 10, 1 => 101010 111 => 111이 먼저올 수 있게 처리
    number = sorted(number,key=lambda x:x*3, reverse=True)
    
    # int -> str 이유 : 0으로만 구성되는 경우, 0 하나만 반환되도록 설정
    return str(int("".join(number)))

(3) 코드 결과

  • 성능 요약 : 메모리 10.3 MB, 시간 0.01 ms
  • 채점결과 : 정확성 100.0, 합계 100.0/100.0

(4) 코드 리뷰 및 회고

  • 우선 숫자가 아닌 문자열인 경우, 정렬 기준은 숫자의 크기가 아닌 순서이다. (ASKII)
    • 이전에는 string type의 숫자도 정렬이 되길래 숫자의 크기를 기준으로 정렬이 이루어지는 것으로 생각하였다.
  • sorted로 정렬할 때, 내림차순으로 설정하였는데 key에 lambda x:x*3을 한 이유는 원소가 0 이상 1000 이하라는 조건 때문이다.
    • 40과 4 가 있을 때, 3을 곱하면 404040, 444가 된다.
      • 즉, 444가 먼저올 수 있도록 설정하기 위해 3을 곱한 기준으로 정렬하였다.
  • 이번 문제는 많은 검색을 통해 해결하였다.
  • 이번 문제를 해결하면서, 꼭 알아둘 점이 있다면 문자형태의 숫자를 정렬할 때 기준이 숫자의 순서라는 점이다.
  • LGTM :)


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기