[Programmers] - 가장 큰 수

오동훈·2021년 8월 17일
0

Programmers

목록 보기
58/64
post-thumbnail

1. Problem 📃

📚 출처 - 프로그래머스

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

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한사항

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

입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

2. Logic 👨‍🏫

순열을 이용해 풀어본 코드
1. 순열로 나타낼 수 있는 모든 경우의 수를 다 구해준다. 이 경우 튜플 형태로 반환되기 때문에 리스트 형태로 변환이 필요하다.
2. join을 이용해 문자열을 합쳐주기 위해서 전제조건은 자료형이 문자열일때의 경우이다. 따라서 먼저 들어오는 자료형을 문자열로 바꿔주는 과정을 거친 뒤, 순열로 나타낼 수 있는 모든 경우의 수를 나타내주고, join으로 합쳐주게 되면 된다.
3. 정렬을 이용해 제일 큰 수를 반환해준다.

하지만 순열을 이용해 푼 경우, 시간초과로 인해 해결이 불가능했다.
이유를 찾아봤는데 순열과 같은 경우의 시간복잡도는 O(N!)이므로 시간초과가 발생했던 것이다.
그래서 시간복잡도가 빠른 해싱 기법을 이용해 풀어보았다.


해싱을 이용해 풀어본 코드
1. 정수형 자료형으로 되어있는 리스트를 문자열 리스트로 변환해준다.
2. 람다를 이용해 비교해 정렬해준다.
3. 정렬된 리스트를 합쳐줌과 동시에 반환해준다.

3. Code 💻

1. 순열을 이용해 풀어본 내 코드😁

from itertools import permutations # 순열

def solution(numbers):
    for i in range(len(numbers)):
        numbers[i] = str(numbers[i])
    perList = list(map(''.join, permutations(numbers, len(numbers))))
    return sorted(perList)[-1]

2. 다른 사람꺼 참조한 코드😁

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

lambda x: x*3는 num 인자 각각의 문자열을 3번 반복해준다는 뜻이다.
num의 인수값이 1000 이하이므로 3자리수로 맞춘 뒤, 비교해주려고 하는것이다.

여기서 lambda x: x*3 을 해준 이유는 [21, 24, 27, 2]라는 리스트가 존재할 때,
['212121', '242424', '272727', '222'] 로 변환되고, 여기서 정렬할 때 문자열 비교는 ASCII 값으로 치환되어 비교됩니다.
따라서 ASCII 값이 큰 ['272727', '242424', '222', '212121'] 순으로 정렬되게 되고,
최종적으로는 ['27', '24', '2', '21'] 이렇게 정렬되게 됩니다.

마지막 라인에 int로 변환해준 이유는 '0000'과 같은 수가 있을때를 대비해 작성한 코드입니다.

profile
삽질의 기록들🐥

0개의 댓글