-
[프로그래머스] 가장 큰 수_정렬알고리즘 2022. 5. 24. 22:08
가장 큰 수_정렬 (level 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 합니다.
풀이
첫번째 시도
combination을 사용해서 접근 하였는데 입력이 100,000과 같이 크게 들어왔을 때 런타임이 오래 걸려 통과하지 못했다. 그러고 나서야 문제 카테고리가 정렬인 것을 확인하였다.
function solution(numbers) { let maxNum='0'; function combination( arr, selectNum, str){ if(selectNum <= 0){ if(parseInt(str)>parseInt(maxNum)){ maxNum = str; } return; } arr.forEach((num,index,origin)=>{ let concated = str + num; const rest = [...origin.slice(0,index),...origin.slice(index+1, origin.length)]; combination(rest, selectNum-1,concated); }) } combination(numbers, numbers.length,''); return maxNum; }
두번째 시도
sorting을 통해 앞 뒤 숫자를 문자열로 더했을 때 오름차순으로 오게 정렬한 뒤 모든 배열을 문자열로 join하였다. 테스트 케이스를 10개 정도 실행해도 모두 통과인데 제출을 하면 10개 정도의 케이스에서 오답이 났다.
function solution(numbers){ const result = Number(numbers.sort(function(a,b){ return Number(b+''+a)-Number(a+''+b); }).join('')); return result+''; }
세번째 시도
문자를 숫자로 바꿔주는 과정에서 Number()함수를 사용한 것이 오류를 발생시켰다. numbers의 모든 값이 0인 경우 result[0]이 0이 되므로 반례 케이스를 설정해줘서 문제를 풀었다.
function solution(numbers){ let result = numbers.sort(function(a,b){ return Number(b+''+a)-Number(a+''+b); }).join(''); if(result[0]==='0'){ result = '0'; } return result; }
더 나은 로직 또는 클린 코드를 위한 피드백은 감사히 받겠습니다 😄
'알고리즘' 카테고리의 다른 글
[프로그래머스] 영어 끝말잇기_연습문제 (0) 2022.05.29 [프로그래머스] 스킬트리_연습문제 (0) 2022.05.27 [프로그래머스] 최댓값과 최솟값_연습문제 (0) 2022.05.26 [프로그래머스] 구명 보트_Greedy (0) 2022.05.25 [프로그래머스] 소수찾기_완전탐색 (0) 2022.05.23