1. 문제 설명
- 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내라.
- 예를들어 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고 가장 큰 수는 6210이다.
- 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 가장 큰 수를 문자열로 바꾸어 return하라.
2. 제한사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으므로 문자열로 바꾸어 return 합니다.
3. 입출력 예
array | return |
[6, 10, 2] | "6210" |
[3,30,34,5,9] | "9534330" |
4. 풀이 접근
- array의 numbers를 모두 문자열로 바꿔준다.
- numbers의 원소는 0 이상 1,000이하이므로 각 문자열에 3번씩 곱해준다.
- 3, 30, 34의 경우 3333-3030-3434 = 34,3,30 이렇게 크기를 비교할 수 있으므로
- 그상태에서 내림차순으로 정렬한다.
- int형으로 한 번 바꿔주고 str형으로 다시 바꿔준다.
- 0000 같은 수가 있을 수 있으므로 -> 0으로 바꿔주는 작업
5. 코드
def solution(array):
array = list(map(str, array)) # 1
array.sort(key = lambda x : x* 3, reverse = True) # 2: 각 요소 3을 곱해준다면~ , 3
array = str(int("".join(array))) # 4
return array
- map() 함수는 리스트를 인자로 받고, 이 리스트의 아이템들을 다른 값으로 변경할 때 사용한다.
- list형태이므로 list() 함수를 사용한다.
- key (즉, array의 문자열 값들) 을 세 번씩 곱해줬을 때 큰 순서대로 내림차순으로 정렬해준다.
- 0000같은 경우를 방지하기 위해 int 형으로 바꿔준 후 다시 str형으로 바꾼다.
def solution(array):
array = sorted(list(map(str, array)), key = lambda x : x * 3, reverse = True)
return str(int("".join(array)))
- 굳이 간결하게 한줄로 쓴다면 이렇게..
6. 알아둘만한 문법
array = ["안녕","애들아"]
"".join(array)
",".join(array)
#출력 결과
안녕 애들아
안녕,애들아
- 파이썬 리스트 문자열 합치기 -> ""에 아무것도 안 썻으므로 띄어쓰기로 출력
- 반대로 ""안에 ,를 사용했으므로 ,기준으로 출력
array = list(map(str, array))
- 리스트 형 변환, 리스트안 요소들의 정수형을 문자열로 변경
<lambda 함수>
list(filter(lambda x : x < 7, array))
- list 형 array에서 각 요소가 7보다 작은 경우만 출력
array.sort(key = lambda x : x * 3, reverse = True)
- array 배열의 각 요소(key 값)를 3씩 곱해보고 큰 순서대로 내림차순 정렬 (실제 곱해지는 건 아님)
'CodingTest > 정렬 알고리즘' 카테고리의 다른 글
프로그래머스 (Level 2) - H-index (0) | 2022.08.06 |
---|---|
프로그래머스 (Level 1) - k번째 수 (0) | 2022.08.06 |
두 배열의 원소 교체 (0) | 2022.07.08 |
정렬 알고리즘 종류와 특징 비교하기 (0) | 2022.07.08 |
계수 정렬 (0) | 2022.07.08 |