211119 - 가장 큰 수

이상해씨·2021년 11월 19일
0

알고리즘 풀이

목록 보기
16/94

◾ 가장 큰 수 : 프로그래머스 LEVEL 2

문제

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

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

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


입력

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

출력

  • 만들 수 있는 가장 큰 수를 문자열로 반환

입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

◾ 풀이

1. 해설

  • 주어진 정수를 내림차순 정렬하여 최대값을 만든다.
  • 9와 955가 있다면 9가 먼저 나와야한다.
    • 955가 먼저 나오는 경우 : 9559
    • 9가 먼저 나오는 경우 : 9959
  • 숫자를 그대로 정렬하면 값끼리 정렬이되기 떄문에 각 자리수별로 확인하기 위해 문자열로 변환해 정렬한다.(문자열은 각 자리별 문자의 유니 코드값으로 비교한다.)
  • 최대 1000으로 최소 3자리까지 비교가 필요하다. 따라서 문자열로 변환된 각 원소에 곱하기 연산을 통해 3자리수까지 비교한다.
    • a = '9', b ='955'
    • a 3 = '999', b 3 = '955955955'
    • 첫 자리는 9로 같지만 두 번째 자리에서 9, 5로 달라지므로 a가 더 큰 값이 된다.

2. 프로그램

  1. 각 정수 str형 변환
  2. (원소 * 3)을 기준으로 내림차순 정렬
  3. join을 통해 str형 변환 -> int형 변환 -> str형 변환
# 코드
def solution(numbers):
    # 문자열로 변환
    numbers = [str(num) for num in numbers]
    # 원소 * 3을 기준으로 내림차순 정렬
    # 1000이하의 수이므로 최소 3자리를 비교하기 위해 3을 곱한다.
    numbers.sort(key=lambda num : num*3, reverse=True)
    # 0이 여러개인 패턴이 있기 때문에 int형 변환 후 다시 str형으로 변환한다.
    # 예시) '0000' -> 0 -> '0'
    return str(int(''.join(numbers)))

profile
후라이드 치킨

0개의 댓글

관련 채용 정보