KEEP GOING

[python] 프로그래머스 42746번 : 가장 큰 수 본문

code review/sort

[python] 프로그래머스 42746번 : 가장 큰 수

jmHan 2021. 12. 27. 11:38
반응형

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

 

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

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

programmers.co.kr

 

1. 에러난 코드 

def solution(numbers):
    answer = ''
    numbers = [str(number)*3 for number in numbers]
    numbers.sort(key=lambda x:(-int(x[0]),-int(x[1]),-int(x[2])))
    for number in numbers:
        answer += number[:len(number)//3]
        
    return answer

가장 큰 수를 만들기 위해서 우선 input 값의 numbers 원소의 사이즈를 3자리수로 맞춰주는 것이 핵심이었다. 문제에서 numbers 원소의 길이를 아래와 같이 제한해주었기 때문이다. 

  • numbers의 원소는 0 이상 1,000 이하입니다.

예를들어 numbers의 원소로 9와 97이 들어왔을때 

9 vs 97

999 vs 979797

와 같이 변경하여 정렬하는 문제이다. 

숫자 사이즈를 변경하지 않고 2번째 자리 수에 접근하게 되면 9는 10의 자리가 없기 때문에 range error가 발생하게 된다. 그래서 반드시 3자리수로 맞춰서 정렬해주어야 하는 것이다. 

 

lambda 함수와 set 함수 개념을 이용하여 첫째 그리고 둘째 셋째 자리에 접근하여, 붙이는데 큰 수가 되도록 정렬하게끔 접근하였다. 위와 같이 접근하면 numbers 자체에 원소 사이즈가 3배가 되어 저장되기 때문에 아래 코드와 같이 정렬시에만 해당 개념을 사용해주도록 구현하면 깔끔해진다.

 

 

2. 정답인 코드 

def solution(numbers):
    answer = ''
    numbers = [str(number) for number in numbers]
    numbers.sort(key = lambda x:x*3, reverse = True)
    
    for number in numbers:
        answer += number
    # 11번 케이스 에러 처리 
    if eval(answer) == 0:
        return "0"

    return answer

 

11번 케이스의 경우 데이터 값으로 [0,0,0,0]이 들어온 경우 return 값이 "0000"으로 출력되지만 정답은 "0"이다.

eval 함수를 사용하여 원소가 모두 0이어서 모두 더해도 0이 되는 경우엔 따로 "0"을 리턴하도록 처리해주었다.  

반응형
Comments