[PS] 가장 큰 수 (LV2)
프로그래머스 레벨2
가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
풀이
function solution(numbers) {
// numbers를 sort함수로 정렬한다
const answer = numbers
.sort((a, b) => {
// 30,34같은 경우에는 34가 앞으로 30이 앞으로 가야하므로
// b와 a를 String형태로 바꿔준후 더해준다
/**
* 1. b(34), a(30) 3430 - 3034
* 2. b가 앞으로온다
* 3. 이런식으로 정렬을 마무리 한뒤
* 4. join으로 숫자형태의 문자열을 만들어준다.
*/
a = a.toString();
b = b.toString();
return b + a - (a + b);
})
.join("");
// 근데 [0,0,0] 은 "0"의 형태로 나와야한다
// 테스트케이스중 하나가 히든케이스로 계속나와서
// 100,200 등등.. 다맞아서 그러면 0이 여러개일수도있겟구나 싶어서 삼항연산자로 처리
// (앞이 0인경우는 0이 연속되는경우 말고 없기에)
return answer[0] == 0 ? "0" : answer;
}
마무리
정렬
숫자 자릿수를 무작정 비교하려고하니 너무 오래걸리고 코드가 길어져서 다 지우고 그냥 숫자문자열을 더해주면 3430 3034형태가 되니까 두개를 비교하면 되겟구나 싶어서 (b+a) - (a+b) 형태로하니까 테스트케이스 1개에서 계속 틀렷다
아무리 테스트케이스를 추가해도 전부 맞아서 제한사항을 확인하니 0 또는 양의정수가 담긴 배열이라
[0,0,0,0,0,0,0]
형태면 "0000000"이 나오는걸 확인해서 삼항연산자로 0이 나오게 처리했다.
Author And Source
이 문제에 관하여([PS] 가장 큰 수 (LV2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sjy0917/가장-큰-수-LV2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)