관리 메뉴

공부 기록장 💻

[알고리즘/정렬] 프로그래머스 가장 큰 수 본문

# CS Study/Algorithms

[알고리즘/정렬] 프로그래머스 가장 큰 수

dream_for 2022. 8. 23. 09:35

4. 프로그래머스 가장 큰 수 

문제

코딩테스트 연습 - 가장 큰 수

 

문제 설명

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"

 


💡나의 문제 풀이

문제 해결 아이디어

  • 자릿 수의 가장 앞에 오는 수가 가장 큰 것대로 정렬 해야 한다.

 

고려 사항

  • 3과 30 을 비교하는 예를 들어보면, 두번째 자리를 비교해야 하지만 3은 한 자리 수이다. 어떻게 비교할 것인가?
    • 3과 30,31,32에 대해서 비교하면 3이 앞에 나와야 하지만, 33 이후의 34부터는 34가 앞으로 나와야 큰 수를 만들 수 있다.
    • 따라서 3이라는 숫자와 30을 비교할 때는, 3을 33으로 바꾸어 33과 30을 비교하면 간단하다.
    • 이 방법을 통해, 수가 1,000이하라는 점을 고려해 각 수를 문자열로 바꾼 뒤 문자열의 길이의 3배만큼 곱하여 서로 비교할 수 있도록 만든다.

작성 코드

def solution(numbers):
    arr = [str(n)*3 for n in numbers]
    result = ""
    arr.sort(reverse=True)
    for a in arr:
        for i in range(int(len(a)/3)):
            result += a[i]

    return str(int(result))

def main():
    print(solution([6,10,2]))
    print(solution([3,30,34,5,9]))
    print(solution([30,300,303,330,333,3,33]))
    
    
main()

 

 


답안 코드

  • 문자열을 3번 곱한 것을 내림차순으로 정렬하고 각 리스트의 요소들을 이어붙인 것을 출력한다.
def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    return str(int(''.join(numbers)))

 

리뷰 및 점검

  • 문제의 조건 중 numbers의 원소가 0 이상, 1,000 이하라는 점을 유의해서 보았어야 한다.
  • 문제를 구현하는 것은 쉬웠으나, 3번 곱한다는 아이디어를 얻는데까지 오랜 시간이 걸렸다.
728x90
반응형
Comments