티스토리 뷰

1. 문제

programmers.co.kr/learn/courses/30/lessons/42746

 

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

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

programmers.co.kr

2. 소스코드 (Python3)

import functools

def comp(a,b):

    if int(a+b) < int(b+a): return 1

    if int(a+b) > int(b+a): return -1

    return 0

def solution(numbers):

    strnum = [str(n) for n in numbers]

    strnum.sort(key = functools.cmp_to_key(comp))

    answer = str(int(''.join(strnum)))

   

    return answer

 

3. 고찰

1) 내가 원하는 기준으로 정렬할 때 키워드

import functools

리스트.sort(key = functools.cmp_to_key(내 정렬 기준 함수))

 

2) join 함수

split()함수와 정반대의 기능.

문자열을 원소로 갖는 리스트를 입력하면 -> 문자열 리스트를 구분자를 갖는 하나의 문자열(string)로 반환한다.

문자열리턴 = '구분자'.join(문자열 리스트)

 

3) 조심해야할 문제 조건

numbers가 모두 0인 경우, 문자열을 정렬한 후 합치면 000 ··· 0 이다. 이것은 숫자로 0으로 표기하므로 이에 대한 처리를 해줘야 한다.

 

4) 시간복잡도

숫자리스트 -> 문자리스트로 변환하는 연산 : O(N)

sort함수 : O(N log N)

join함수 : O(N)

따라서 위 소스코드의 시간복잡도는 O(N + N log N + N) => O(N log N)이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함