본문 바로가기
코딩/코딩테스트

[프로그래머스] 가장 큰 수 풀이 - Python3

by yenua 2024. 3. 30.
반응형

문제 설명

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"

풀이

더보기

삽질 코드..

from collections import deque

def solution(numbers):
    answer = ''
    numbers = list(map(str, numbers))
    length = len(numbers)
    for i in range(length):
        if len(numbers[i]) == 1:
            numbers[i] = numbers[i]*4+'-'
    numbers.sort(reverse=True)
    
    for i in numbers:
        if i[-1:] == '-':
            answer += i[:1]
        else:
            answer += str(int(i))
    return answer

항상 느끼는 거지만 반례 생각하는게 너무 어렵다.. 

3, 34, 30 이렇게 있을 때는 34330 이런식으로 가야 하기 때문에, 3을 33으로 생각해주는게 좋다. 그런데 문제에서는 1000까지 숫자가 주어지므로, 그냥 모든 문자열을 *3을 해서 정렬을 시켜버리면 해당 문제를 해결할 수 있다.

또한 테스트 케이스에 0만 존재하는 경우, 00, 000 이런식으로 출력될 수 있으므로, 해당 경우 0으로 바꿔줄 수 있게 int 형식으로 바꾼 다음 출력해주어야 한다. 파이썬이니까 가능한 요행이랄까..(아래 내용 참고) 따로 처리가 필요하다.

from collections import deque

def solution(numbers):
    answer = ''
    numbers = list(map(str, numbers))
    length = len(numbers)
    for i in range(length):
        numbers[i] = numbers[i]*3
    numbers.sort(reverse=True)
    
    for i in numbers:
        if len(i) == 3:
            answer += i[:1]
        else:
            answer += i[:len(i)//3]
    chk = False
    for i in answer:
        if i != '0':
            #print(i, type(i), end=' ')
            chk = True
    #print(answer)
    if chk:
        return answer
    else:
        return '0'

 

참고로, 프로그래머스 최고 추천을 받은 최적의 답안은 아래와 같다.

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

print(solution([100000 for _ in range(1000)]))로 테스트 하는 경우, 위와 같이 숫자로 변경하는 방식으로는 실행이 불가능하다. 그러나 2024년 3월 기준으로는 해당 부분에 대한 테스트 케이스가 추가되어 있지 않아 채점에는 영향을 주진 않는다. 관련 내용은 프로그래머스 측에 문의를 넣은 상태다. 4월 1일 답변을 받았으나, 문제에는 오류가 없으니 다시 한번 작성한 코드를 검토하여 풀이해달라는 답변을 받았다. 문제 자체에 치명적인 오류가 없는 이상, 테스트케이스가 없어서 딥하게 파고 들어갔을 때 틀려야 할 것이 맞다고 측정되는 점은 큰 문제가 아니라고 판단하는 것 같다.. 실제 시험에서도 그런가..?

반응형