[Py_Lv2] 가장 큰 수

Sunghun📈·2021년 3월 16일
0

프로그래머스

목록 보기
22/93
post-thumbnail

문제 설명

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

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

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

제한 사항

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

입출력 예

접근법

문제는 이해했습니다.

하지만, 접근조차 할 수 없어 결국 구글링을 통해 여러 풀이방법을 보고 이해하는데 2시간이 넘게
걸렸습니다.😥😟

역시나 그렇듯 코딩도장을 통해 2번째 학습 중이지만 실전 알고리즘 문제를 푸는것은 어렵습니다.

좋은 알고리즘이 있어 이를 참고하고 어떻게 동작하는지 이해하기 위해 아래 내용을 공부하였습니다.

복습에 중점을 두고 공부하기로 마음먹었기 때문에 이후에 다시 공부를 하겠습니다.

- lambda와 map의 활용법 🏆**중요**
- sort 함수의 key 사용법
- ASCII 값 상태에서 문자열 비교
- join 함수 사용법

여러 코드를 공부 중 아래 코드의 형태는 간결함에 반해 가져와 보았습니다.

3가지 핵심적인 부분을 말해보겠습니다.

x*3을 하는 이유는 무엇일까?

  • num의 인수값이 1000 이하이므로 3자리수로 맞춘 뒤, 비교하겠다는 뜻.
    아직도 잘 이해가 가지 않는 부분입니다. 하지만 대략적으로 3자리
    즉 문자열 3자리를 만들어비교를 하겠다는 뜻인것 같습니다만
    아래 적을 내용에 의해 더 이해가 가지 않았습니다.

문자열 비교

  • x*3을 통해 '666', '101010', '222'가 되었고 이를 비교해야합니다.
    하지만 str()함수로 인해 문자열 상태이기 떄문에 비교시 ASCII 값으로 치환되어 정렬됩니다.
    그런데 여기서 앞서 이해가 가지 않는다는 부분이 바로 여기입니다.
    공부한 내용 대로라면 ASCII 값으로 치환된 후 값 비교시 첫번째 인덱스 값만을 비교한다고 알고 있습니다.
    예) 6 = 86, 1 = 81, 2 = 82 이므로 6 > 2 > 1 순입니다.

위 내용대로라면 굳이 x*3이 필요한지 의문입니다. 추후 공부를 통해 이를 이해해보도록 하겠습니다.

sort()의 기본 정렬 기준

  • 기본 정렬 기준은 오름차순이다.
    [10, 2, 6]으로 기본 정렬된 순서를 reverse = True를 통해 내림차순으로 변경해줍니다.

=============================================================

def solution(numbers):
    numbers = list(map(str, numbers)) 
    numbers.sort(key = lambda x : x*3, reverse = True) 
    return str(int(''.join(numbers)))
profile
데이터 분석과 AI 분야의 전문가를 꿈꾸는 청년

0개의 댓글