감자튀김 공장🍟

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

Algorithm/Programmers

[프로그래머스/Lv.2] 가장 큰 수 (with 파이썬)

Potato potage 2023. 3. 23. 23:33
반응형

✔ 문제

문제 설명

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

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

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

 

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

 

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


풀이

오답 코드 (입출력 예제 2번 실패)

def solution(numbers):
    answer = ''
    for i in range(len(numbers)):
        numbers[i] = str(numbers[i])
    numbers.sort(reverse=True)
    for i in numbers:
        answer += i
    return answer

 

오답 코드 2 (TC 11번 - [0, 0, 0, 0])

def solution(numbers):
    answer = ''
    num_str = []
    for i in numbers:
        num_str.append(str(i))
    num_str.sort(key=lambda x: x*3, reverse=True)
    for i in num_str:
        answer += i
    return answer

 

정답 코드

def solution(numbers):
    num_str = []
    for i in numbers:
        num_str.append(str(i))
    num_str.sort(key=lambda x: x*3, reverse=True)
    
    return str(int(''.join(num_str)))

✔ 설명

1. 숫자 상태에서 정렬을 하지 말고 문자열로 치환

2. 문자열로 변경한 숫자에 3을 곱한 값으로 재정렬

    3을 곱하지 않고 정렬 시 사전값으로 정렬은 되나 TC에 맞지 않은 답이 나올 수 있음

    ex) [3, 30, 34, 5, 9]을 *3 없이 정렬한다면(reverse=True) 사전 순으로 정렬이 되는데

      [9, 5, 34, 30, 3] 과 같이 정렬이 된다. 이를 바로 return 하게 된다면 9534330이 아닌 9534303이 리턴된다.

     따라서 *3을 곱하여 [999, 555, 343434, 303030, 333] 을 가지고 정렬을 해야한다.

3. 값을 반환 시 int > str 단계를 거쳐야 한다.


✔ 후기

설명의 1번까지는 해결했으나 [30, 3] 이 순서를 바꾸는 방법을 생각해낼 수 없었다.

그리고 *3을 한 후 제출했더니 TC 11번에서 실패가 떠서 다시 고민했다.

11번의 경우 numbers = [0,0,0,0] 이라 return 값은 0이 나와야한다.

for문을 돌면서 answer += i 를 하면 0000이 return 되기 때문에 설명 3번처럼 num_str을 int로 바꾼 후 str로 다시 변경해야한다.

반응형
Comments