취준생의 코딩테스트 연습기

[프로그래머스] 가장 큰 수 / 파이썬(python) 본문

코딩테스트/프로그래머스

[프로그래머스] 가장 큰 수 / 파이썬(python)

Jiwon_C 2021. 4. 2. 21:31

# 문제 링크

programmers.co.kr/learn/courses/30/lessons/42746

 

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

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

# Soultion (실패)

itertools를 이용하여 순열을 사용하여 문제를 해결했지만, 시간 초과 문제 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
import itertools
 
def solution(numbers):
    answer = 0
    new_numbers =[]
    for n in numbers:
        new_numbers.append(str(n))
        
    for i in itertools.permutations(new_numbers,len(numbers)):
        if answer < int(''.join(i)):
            answer = int(''.join(i))
    
    return str(answer)
cs

 

# Soultion (실패)

for문을 돌면서 숫자를 str()로 변환한 뒤, 정렬을 했지만 3, 30과 같은 경우에서 문제 발생

1
2
3
4
5
6
7
8
9
10
11
def solution(numbers):
    answer = ''
    
    while(numbers):
        max_num = 0
        for i in numbers:
            if str(max_num) < str(i):
                max_num = i
        answer+=str(max_num)
        numbers.remove(max_num)
    return answer
cs

 

-> 도저히 해결방법이 생각나지 않아 다른사람들의 풀이를 보고 도움 받음

 

# Soultion (성공)

1
2
3
4
5
def solution(numbers):
  
    num_li = list(map(str,numbers)) # int를 str로 형변환
    num_li.sort(key = lambda x: x*3, reverse=True)
    return str(int(''.join(num_li)))
cs

3. 30보다는 9가 더 앞에와야하므로, str로 형변환을 시켜준다. 

   나는 위에서 for문을 이용하여 무식하게 str로 변환을 시켰지만, map함수를 이용하여 간단하게 형변환이 가능하다.

4. str로 바꾼 숫자를 정렬시켜준다. 이때, 3과 30을 비교했을때 3이 더 앞에 나와야하므로, 최대 자릿수인 1000을 맞추주기위하여 lambda 함수를 사용하여 x를 3배시켜준다.

5. 정렬된 숫자를 출력한다. str(int())로 int형으로 한번 변환시켜주는 이유는 00과 같은 경우를 0으로 바꿔주기 위해서이다.

 

Comments