Programmers - 가장 큰 수 구하기

Song_MinGyu·2022년 2월 24일
0

Algorithm

목록 보기
7/30
post-thumbnail

📖 프로그래머스 - 가장 큰 수 구하기

📌 문제

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

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

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

제한 사항

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

입출력 예

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

def solution(numbers):
    answer=''
    numbers = list(map(str,numbers))

    #string sort의 기준 앞글자 하나씩 부터 비교 앞글자가 같다면 뒷글자 차이날때까지 비교함
    #동일한 기준을 만들기 위해서 numbers 원소의 최소값 또한 numbers의 최대치인 1000 근처까지 끌어올려서 동일 기준으로 비교 시작
    numbers.sort(key=lambda x: x*3, reverse=True)

    #0만 무수히 들어가면 중복 제거를 위해서 해당 작업 실시
    answer = str(int(''.join(numbers)))
    return answer

numbers1 = [6,10,2]
numbers2 = [3,30,34,5,9]

print(solution(numbers1))
print(solution(numbers2))

📌 풀이

결론부터 보면 정렬 기준만 잘 잡으면 어렵지 않게 풀 수 있는 문제,
string sort의 기준 앞글자 하나씩 부터 비교 앞글자가 같다면 뒷글자 차이날때까지 비교함
-->Python String 비교 방법
그냥 비교하게 된다면 문자열 길이의 차이 때문에 이 문제가 원하는 정렬 기준에 도달하지 못하고 다른 정렬 결과를 만들게 된다. 그래서 numbers의 최소한 원소의 길이를 numbers의 최대치인 1000 근처까지 통일시켜서 정렬을 시도한다. 해당 기준을 만족하지 못한다면, 두번째 입력 예제가 "9534330"이 아닌 "9533430"으로 출력 이번 문제의 Key Point

📌 후기

해당 문제의 정렬 기준을 생각하다가 결국 저 방법을 떠올리지 못하고 백트래킹을 이용해서 수열 리스트를 만든 다음 최대치를 출력하는 방법을 사용해야하나까지 생각했는데, 결국 풀이는 알맞은 정렬 방법을 사용하는 것이었다. 좀 더 어떻게 문제 풀어야 하는 생각이 필요함을 느낀다.

profile
Always try to Change and Keep this mind

0개의 댓글