본문 바로가기
Algorithm/Python

[프로그래머스] 가장 큰 수

by _sweep 2022. 2. 2.

문제 링크 >> https://programmers.co.kr/learn/courses/30/lessons/42746

 

 

📋 문제

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

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

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

 

 

👉 입출

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

 

 

 

📝 풀이

❌ 첫 번째 풀이

def solution(numbers):
    answer = ''
    nums = sorted([[int(str(number)[0]), number] for number in numbers], reverse=True)
    for i in nums:
      answer += str(i[1])
    return answer

 

첫 번째 예제만 보고 가장 앞의 자리 수를 기준으로 정렬한 뒤 붙이면 되지 않을까 했었다.

그러니까 [6, 10, 2]의 예제에 대해서 6, 1, 2를 뽑아내고 이를 내림차순으로 정렬하면 6, 2, 1이 된다.

따라서 이 순으로 원본 숫자를 배치시키면 6210이 된다.

 

하지만 이 풀이는 바로 2번째 예제에서 깨져버렸다.

[3, 30, 34, 5, 9]에 대해서 9534330이 나와야 하지만 9534303이 나오기 때문이다.

 

❌ 두 번째 풀이

def solution(numbers):
    nums = sorted(list(map(str, numbers)), reverse=True)
    
    for i in range(len(nums)-1):
        if nums[i] + nums[i+1] < nums[i+1] + nums[i]:
            nums[i], nums[i+1] = nums[i+1], nums[i]
    
    return str(int(''.join(nums)))

 

일단 1차적으로 string 형태의 숫자들에 대해서 내림차순으로 정렬해준 뒤 해당 리스트를 순회하면서 앞뒤로 합친 문자열들을 비교했다.

그리고 더 큰 수가 나올 수 있도록 순서를 바꿔주었다.

 

이 풀이는 1~6 테스트케이스에서 실패한다.

반례라는 반례는 다 찾아봤지만 모두 결과가 예상한 대로 나오는데 아직 왜 틀리는지 모르겠다.

 

++

반례를 찾았다.

[3, 30, 34, 5, 9, 4, 40, 42]에 대해 954424034330이라는 답을 얻어야 하지만 954244034330이라는 결과를 얻었다.

 

✔️ 세 번째 풀이

def solution(numbers):
    nums = sorted(list(map(str, numbers)),key=lambda x:x*3, reverse=True)
    return str(int(''.join(nums)))

 

결국 위 방식으로 통과했다.

numbers의 원소가 1000 이하임을 이용한 풀이방법이다.

두 번째 예제인 [3, 30, 34, 5, 9]를 살펴보면 ['333', '303030', '343434', '555', '999']에 대해 정렬을 하게 되는데 문자열에 대한 정렬은 사전순이므로 ['999', '555', '343434', '333', '303030']이 되어 최종적으로 ['9', '5', '34', '3', '30']을 얻을 수 있다.

따라서 해당 결과를 join으로 문자열로 만들어주면 된다.

이때 '0000'과 같은 결과는 0으로 출력하기 위해 nums를 int형으로 바꿨다가 다시 string형으로 변환한다. 

 

 

 

 

 

'Algorithm > Python' 카테고리의 다른 글

[백준4673번] 셀프 넘버  (0) 2022.02.03
[프로그래머스] H-Index  (0) 2022.02.03
[프로그래머스] K번째 수  (0) 2022.02.02
[LeetCode] Longest Word in Dictionary  (0) 2022.01.31
[백준1316번] 그룹 단어 체커  (0) 2022.01.31

댓글