파이썬 알고리즘 : 가장 큰 수

정렬

2024년 4월 2일 알고리즘 문제풀이

문제

난이도

Lv.2

코드

1차

실패

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def check_first(s):
    if len(str(s)) == 1:
        return int(s)
    else:
        return int(str(s)[0])

def solution(numbers):
    n = len(numbers)
    answer = ''
    arr = []
    for _ in range(10):
        arr.append([])
    for num in numbers:
        tmp = check_first(num)
        arr[num].append(num)
        
    return answer

두 수 중 먼저 와야할 수는 가장 앞에 있는 수가 큰 수면 되겠다 싶었다. 그래서 모든 수를 맨 앞이 1인 수, 2인 수, … , 9인 수 까지 분류하려했다. 생각해보니 그 다음은? 그 안을 또 나누기엔 컴퓨터가 터지지 않을까? 수 두 개를 비교할 때, 길이는 중요하지 않다는 걸 파악했다. 그리고 가장 앞에 있는 수가 중요하다는 것도 캐치했다. 두번 째로 오는 수는 앞자리 수와의 비교가 중요하다. 예를 들어, 30,31,32 는 두 번째 자리가 0,1,2 로 모두 3보다 작으므로 그냥 ‘3’보다 늦게 올 애들이다. 반면 34,35 등은 3보다 더 앞에 나타나야 한다. 비교를 쉽게 하기 위해 앞자리를 복붙하면 되겠다고 생각했는데, 1000 이하이니 싹 다 3자리 짜리로 만들어주면 되겠다.

2차

40/100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(numbers):
    answer = ''
    arr = []
    for i in range(len(numbers)):
        number = numbers[i]
        tmp = str(number)
        if len(tmp) == 1:
            arr.append([tmp+tmp+tmp,i])
            print()
        elif len(tmp) == 2:
            arr.append([tmp+tmp[0],i])
        else:
            arr.append([tmp,i])
    arr.sort(reverse=True)
    for x in arr:
        answer += str(numbers[x[1]])
    return answer

생각해보니, 343과 34가 있다면 어떤 녀석이 앞으로 와야할까? 내가 짠 로직에 의하면 둘다 343이므로 입력이 먼저된 순서가 중요하겠지만 실제론 그렇지 않다. 34, 343, 1이 있다고 가정할 때 [34,343,1] 순서로 정렬되면 343431 이 되고 [343,34,1] 순서로 정렬되면 343341이 된다. 전자가 더 크다. 34가 343보다 먼저 와야 한다는 뜻이다. 3자리로 만들어 비교가 안되었으니 4자리로 만들면 어떨까? 34는 3434가 되고 343은 3433이 되므로 올바른 비교가 될듯 하다. 4자리로 만들자.

3차

93.3/100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(numbers):
    answer = ''
    arr = []
    for i in range(len(numbers)):
        number = numbers[i]
        tmp = str(number)
        if len(tmp) == 1:
            arr.append([tmp+tmp+tmp+tmp,i])
            print()
        elif len(tmp) == 2:
            arr.append([tmp+tmp,i])
        else:
            arr.append([tmp+tmp[0],i])
    arr.sort(reverse=True)
    for x in arr:
        answer += str(numbers[x[1]])
    return answer

딱 1가지 예외가 생겼다. 이럴떄는 보통 최솟값이나 최댓값을 따지면 된다. 싹 다 0일 때가 문제인 듯 하다.

4차

100/100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def solution(numbers):
    if not sum(numbers):
        return str(0)
    answer = ''
    arr = []
    for i in range(len(numbers)):
        number = numbers[i]
        tmp = str(number)
        if len(tmp) == 1:
            arr.append([tmp+tmp+tmp+tmp,i])
            print()
        elif len(tmp) == 2:
            arr.append([tmp+tmp,i])
        else:
            arr.append([tmp+tmp[0],i])
    arr.sort(reverse=True)
    for x in arr:
        answer += str(numbers[x[1]])
    return answer