문제
문제 설명
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" |
새로 사용한 함수
sort 함수를 lambda 식과 함께 사용
예시는 밑과 같으며 키값으로 사용하는 lamda x를 옆의 매개변수 부분의 함수를 수행하여 저장하고 이를 기준으로 정렬을 수행 내림차순 정렬을 위하여 sort함수에 reverse 조건에 true를 주었다.
# sort 함수
keys.sort(key = lambda x: x['key'])
# [{'key': 3}, {'key': 5}, {'key': 8}, {'key': 9}]
join
구분자를 넣어서 문자열을 가공할때 사용 밑의 코드에서는 아무것도 넣지 않는 것으로 ''을 사용하였으므로 배열의 각각의 문자 사이에 아무것도 넣지 않고 문자열을 만들어줌
풀이 과정
처음 문제를 접하고 풀어나갈때는 배열에 저장된 문자열의 길이를 기준으로 각각의 배열을 만들고 첫 번째 숫자를 비교하는 방식의 로직을 만들었지만 제대로 구현되지 않아서 기존에 풀이를 한 사람들의 코드를 참고하였다.
1. 이 문제의 핵심은 배열에 들어오는 숫자가 여러자리 숫자일 수 있지만 1000의 자리 숫자를 넘지 않는다는 것이 핵심이다
2. 1번내용을 생각하면서 모든 배열의 숫자에 *3을 해주면서 이것을 기준으로 정렬을 하는 방식을 취한다. 여기서 숫자에 *3이라고 표현하였지만 문자열에 *3을 해주기 때문에 같은 문자열이 3번 반복되는 형태를 취하게 될 것이며 문자열을 정렬하기 때문에 숫자의 크기가 아닌 문자열을 기준으로 정렬되게 될 것이다.
3. 2번처럼 가공된 값을 사용하여 정렬을 하게 되지만 이는 임의의 key 값으로 사용되는 것이며 배열에 있던 숫자를 나타내는 문자열의 밸류를 그대로 사용하기 때문에 return시에 이 숫자들을 다 join 시켜주면 원하는 값을 얻게 된다.
코드
def solution(numbers):
numbers = list(map(str, numbers))
numbers.sort(key=lambda x: x * 3, reverse=True)
return str(int(''.join(numbers)))
'Algorithm' 카테고리의 다른 글
[프로그래머스] 코딩테스트 연습정렬 K번째수 (0) | 2022.08.02 |
---|---|
[프로그래머스] 코딩테스트 연습2018 KAKAO BLIND RECRUITMENT[1차] 비밀지도 (0) | 2022.08.02 |
[프로그래머스] 코딩테스트 연습월간 코드 챌린지 시즌2 약수의 개수와 덧셈 (0) | 2022.07.30 |
[프로그래머스] 코딩테스트 연습 - 나머지가 1이 되는 수 찾기 (0) | 2022.07.29 |
[프로그래머스] 코딩테스트 연습 연습문제 문자열 다루기 기본 (0) | 2022.07.28 |