https://programmers.co.kr/learn/courses/30/lessons/42746
쉬워보였다.
그러나 10과 4중 4를 먼저가도록 만들어야하는데 그 방법을 모르겠다.
그래서 답을 찾아봤다.
신박하게 문자열 *를 이용해 늘려서
비교한다.
큰 문자부터 써야하므로 reverse = True이다.
숫자를 문자로 바꾼 후 그 문자를 ASCII 값으로 치환되어 정렬한다.
숫자들이 str형태로 들어있는 리스트를 정렬하면 숫자가 큰 값순으로 정렬되는 것이 아니다.
맨 앞자리의 문자를 기준으로 정렬이 되는 것이다.
이렇게하면 첫번째 수가 클수록 크다고 정렬된다.
3과 20을 비교하면 3이 더 크다고 정렬되는 것이다.
<num. sort(key = lambda x : x*3, reverse = True)>
key를 통해 정렬의 기준을 설정할 수 있다 -!
문자가 들어있으므로 문자가 3번 반복한 문자를 기준으로 정렬하는 것이다.
3으로 곱하는 이유는 1000자리까지기 때문이다...라고 하면 잘 이해가 안간다.
3과 30을 비교할 때
3이 30보다 먼저 가야한다.
여기서 *3을 하면
333과 303030이 된다.
이렇게 하면 333이 더 커지지게 되므로 *3을 한다.
숫자를 만든 후에 int형으로 만들어 앞자리 0을 제거하고 다시 str로 만들어준다.
int화 해주는 이유는 numbers에 0도 들어갈수있기 때문이다.
[0,0,0,0] 이 들어가면 현재 0000으로 나오므로 int()를 통해 0으로 바꿔야한다.
코드 :
def solution(numbers):
num = list(map(str,numbers)) # str으로 변경
num.sort(key=lambda x : x*3,reverse = True) # 내림차순 -> 큰것부터
answer = str(int(''.join(num))) # 0을 제거하기위해 int형을 거침
return answer
쉽게 풀어쓴 코드 :
def solution(numbers):
answer = 0
tmp = []
for num in numbers :
tmp.append(str(num))
tmp.sort(key = lambda x : x*3,reverse = True)
answer = str(int(''.join(tmp)))
return answer
첫번째 코드처럼 쓰려고 해야하는데 이게 더 쉬워서 자꾸 이렇게 쓴다.
첫번째 코드처럼 쓰는 연습을 하자
복습하면서 나온 코드 :
def solution(numbers):
answer = 0
numbers.sort(key = lambda x : str(x)*3, reverse = True)
answer = str(int(''.join(map(str,numbers))))
return answer
join은 str형태의 인수들에만 적용이 되기때문에 str을 걸어줘야한다.
원래 코드는 str -> 정렬 -> join -> int -> str인데
위 코드는 정렬 -> str -> join -> int -> str이다.
배운점 :
1. sort의 key - lambda
참고 블로그 :
https://jokerldg.github.io/algorithm/2021/05/06/most-big-number.html
복습 :
✅ 20220619
✅ 20220621
✅ 20220623
✅ 20220626
✅ 20220630
'알고리즘 > 프로그래머스문제풀이' 카테고리의 다른 글
[Python/프로그래머스]가장 먼 노드_그래프(BFS) (0) | 2022.06.11 |
---|---|
[Python/프로그래머스]H-Index_정렬 (1) | 2022.06.11 |
[Python/프로그래머스]k번째 수_정렬 (0) | 2022.06.11 |
[프로그래머스/PYHTON]이중우선순위 큐_힙(heap) (0) | 2022.06.11 |
[PYTHON][프로그래머스]디스크 컨트롤러_힙 (0) | 2022.06.11 |