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

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

[제한 사항]

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

[입출력 예]

 


추측)

내림차순으로 정렬하되 같은 첫 숫자로 시작하는 것들 구분이 관건

3이 33이랑은 같지만 34보다 작고 32보다 큼 

끝자리 반복해 더해주고 같은 자리수를 만들고 끝에 끝에자리를 몇번 붙였는지 붙여줌

그 상태로 정렬해주고 끝자리수를 기본으로 해서 붙여준 수만큼 다시 숫자들을 잘라내고 

최종적으로 숫자를 더해주어 처리

 

 

소스코드)

* 1차) 반 이상이 시간초과로 실패 

def solution(numbers):
    answer = ''
    numbers_arr = []
    strNum = ''
    
    for number in numbers :
        strNum = str(number)
        plusNum = 0
        while(number < 1000):
            if number > 1000 : break
            strNum += str(number % 10)
            plusNum += 1
            number = number * 10 + number % 10
        strNum += "*" + str(plusNum) 
        numbers_arr.append(strNum)
        
    numbers_arr.sort()
    numbers_arr.reverse()
    
    for number in numbers_arr :
        answer += number[0:len(number)-int(number[-1])-2]
        
    return answer

 

*2차) 실패 - 11번 뭔데!!!!!!!!!!!!!!

def solution(numbers):
    answer = ''
    numbers_arr = []
    strNum = ''
    
    for number in numbers :
        strNum += str(number)*3
        numbers_arr.append(strNum)
        strNum =""
        
    numbers_arr.sort(reverse=True)
    
    for number in numbers_arr :
        answer += number[0:len(number)//3]
        
    return answer

 

* 3차) 성공 - 11번 케이스는 질문에서 보고 처리 '00000'일때 케이스를 '0'으로 처리

def solution(numbers):
    answer = ''
    numbers_arr = []
    strNum = ''
    
    for number in numbers :
        strNum += str(number)*3             # 한자리 수를 최대값으로 만들때 3번 곱해야 해서 *3
        numbers_arr.append(strNum)          # 배열에 추가
        strNum =''                          # 새로운 숫자를 위해 초기화
        
    numbers_arr.sort(reverse=True)          # 내림차순으로 정렬
    
    for number in numbers_arr :             
        answer += number[:len(number)//3]   # 3번 곱해서 자리수가 얼마만큼 늘어났느냐에 따라 잘라냄
        
    if int(answer) == 0 :                   # 테스트 케이스 11번 : 00000 을 0으로 처리
        answer = '0'
        
    return answer

 

리뷰)

역시 생각했던 부분이 어려웠다.

같은 숫자로 시작하는 것들을 어떻게 비교할 것인지가 중요했던 ㅠ

하지만 문자 경우 숫자와 달리 길이와 상관없이 동일한 위치의 숫자를 문자로 비교하여 더 높은 것을 우선 순위에 놓는다는 것을 깨달았다면 금방 풀 수 있었던 문제였던 거 같다. 제한 사항에 문자열로 바꾸어 return하라는 것도 힌트일지도.

세번 곱해줬던건 1자리 수가 조건인 1000이하에서 최대값을 갖게 해 다른 자리 수들과 비교하게 하기 위해서이다.

2번째 예시에서 보면 3, 30, 34를 비교할때 333, 303030, 343434로 만들어 비교하면 343434, 333, 303030 순서로 정렬된다. 

 

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] 정수삼각형  (0) 2023.01.24
Programmers] 더 맵게  (0) 2023.01.17
Programmers] 신규 아이디 추천  (0) 2022.11.23
Programmers] 시저 암호  (0) 2022.11.23
Programmers] 소수 만들기  (0) 2022.11.22

+ Recent posts