Algorithm/Online judge

[프로그래머스] 정렬 > level 2 > 가장 큰 수

민철킹 2021. 1. 22. 15:19

programmers.co.kr/learn/courses/30/lessons/42746?language=python3

 

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

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

programmers.co.kr

문제 설명

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

 

풀이

첫숫자가 큰게 무조건 앞으로 나와야함
==> 30과 9가 있다면 3보다 9가 크니까 9가 앞으로 나와서
      930이 되는 것이 가장 큰수.
즉 맨 앞숫자를 비교하고 만약같다면 그다음 자리를 비교하면 될듯

첫숫자를 어떻게 비교할까? 자릿수가 다른것도 있는데
각 원소를 문자열로 변환하여 len메소드를 사용해 문자열 길이를 알면
그것의 크기를 알 수있을듯.
문자열로 변환하여 길이 판단 -> 문자열 길이 -1 만큼 10을 곱하여 앞글자 판별 변수만듬
if 30이면 두글자 따라서 앞숫자 판별 변수는 10
따라서 30을 앞숫자 편별 변수로 나눈 몫(//)을 도출하면 3
그 후 숫자비교후 리스트 하나 선언에서 append해놓고
출력은 반복문 돌려서 리스트 끝값까지 출력
for i in range(0, len(ex)):
     print(ex[i], end="") 하면 연결하여 출력가능



+++내가 생각한 논리로는 반복문을 너무 많이써야했고
효율성의 문제가 매우 떨어졌다.

따라서 다른 사람의 코드를 참고하여 작성해보았다.
문자열로 바꾼후 각각 *3하여 문자열을 3번씩 반복시켰다. num의 인수값이 1000이하이므로 3자리수로 맞춘 후 비교하겠다는 뜻이다. 문자열을 비교하면 아스키 코드 값으로 비교되기 때문에 lambda를 사용해 위와같이 정의하고 내림차순으로 정렬하면 된다.

너무 간단하고 좋은 방식이다.
문자열을 반복하여 자릿수로 판단한다는 것이 너무 신박했다.
==> 100프로 나의 힘으로만 문제를 풀지는 못했지만 나만의 논리를
생각해보고 그것을 직접 작성해봤음에 의의를 둔다.
숫자를 꼭 숫자를 통해서만 정렬해야한다는 고정관념 버리기

 

def solution(numbers):
    numbers = list(map(str, numbers))
    numbers.sort(key = lambda x: x*3, reverse=True)

    return str(int(''.join(numbers)))
반응형