programmers.co.kr/learn/courses/30/lessons/42746?language=python3
문제 설명
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)))
'Algorithm > Online judge' 카테고리의 다른 글
[프로그래머스] 탐욕법(Greedy) > level 1 > 체육복 (0) | 2021.01.22 |
---|---|
[프로그래머스] 탐욕법(Greedy) > level 2 > 큰 수 만들기 (0) | 2021.01.22 |
[프로그래머스] 스택/큐 > level2 > 기능개발 (0) | 2021.01.21 |
[프로그래머스] 스택/큐 > level 2 > 주식 가격 (0) | 2021.01.21 |
목적와 방향 (0) | 2021.01.21 |