https://programmers.co.kr/learn/courses/30/lessons/12933
- 숫자를 배열로 바꾸기
- 배열에서 가장 큰 수를 찾고, 그 수를 새로운 스트링에 넣어준후 배열에서 제거하는 함수를 만들고
- 그 함수가 배열의 요소가 하나 남을때까지 계속 실행되도록 재귀함수로 리턴값에 넣어주기
function solution(n) {
let newNum = '';
let numArr = [];
for (let i = 0; i < String(n).length; i++) {
numArr.push(String(n)[i]);
}
function arrToString () {
let largeNum = numArr[0];
for (let i = 1; i < numArr.length; i++) {
if (numArr[i] - largeNum > 0) {
largeNum = numArr[i];
}
}
newNum += largeNum;
numArr.splice(numArr.findIndex(largeNum), 1);
return numArr.length === 1 ? newNum += numArr[0] : arrToString();
}
arrToString();
return Number(newNum);
}
- 무슨 오류인지 도저히 모르겠어서 혹시 몰라 16번 줄 인덱스 찾는 메소드를
arr.indexOf
로 바꿨더니 정상적으로 결과가 나왔다- 알고보니
findIndex
는 인자로 주어진 함수를 테스트해서 참이 나오는 첫번째 인덱스를 출력하는 메소드였다
function solution(n) {
let newNum = '';
let numArr = [];
for (let i = 0; i < String(n).length; i++) {
numArr.push(String(n)[i]);
}
function arrToString () {
let largeNum = numArr[0];
for (let i = 1; i < numArr.length; i++) {
if (numArr[i] - largeNum > 0) {
largeNum = numArr[i];
}
}
newNum += largeNum;
numArr.splice(numArr.indexOf(largeNum), 1);
return numArr.length === 1 ? newNum += numArr[0] : arrToString();
}
arrToString();
return Number(newNum);
}
- 맨날 재귀함수 풀이를 보고 이해만 했었는데 처음으로 내 풀이에 적용을 해서 뿌듯했다
- 문제를 푸는데 핵심인 가장 큰 수를 찾는 메소드를 찾아 쓰지 않고 직접 구현하고 풀어서 만족했다
- 구글링해보니 재귀 호출은 호출 가능한 깊이가 있는데 그 깊이를 넘어서면 런타임 에러가 난다고함
- 그래서 재귀함수 부분을 if, for 문으로 바꿔보기로 함
- 이번엔 런타임 에러는 안났지만, 똑같이 테스트 7 이 실패가됨 ㅠㅠ
- 잘 찾아보니 n이 한자리수일때 문제가 있는 코드였다
function solution(n) {
if (String(n).length === 1) {
return n;
}
let newNum = '';
let numArr = [];
for (let i = 0; i < String(n).length; i++) {
numArr.push(String(n)[i]);
}
for (let i = 0; i < String(n).length - 1; i++) {
let largeNum = numArr[0];
for (let i = 1; i < numArr.length; i++) {
if (numArr[i] - largeNum > 0) {
largeNum = numArr[i];
}
}
newNum += largeNum;
numArr.splice(numArr.indexOf(largeNum), 1);
if (numArr.length === 1) {
newNum += numArr[0];
}
}
return Number(newNum);
}
- 문제가 생기는 한자리수들은 애초에 바로 출력을 해주도록 만들었다
- 재귀함수로 쓴 코드와 비교도 해봤다
function solution(n) {
if (String(n).length === 1) {
return n;
}
let newNum = '';
let numArr = [];
for (let i = 0; i < String(n).length; i++) {
numArr.push(String(n)[i]);
}
function arrToString () {
let largeNum = numArr[0];
for (let i = 1; i < numArr.length; i++) {
if (numArr[i] - largeNum > 0) {
largeNum = numArr[i];
}
}
newNum += largeNum;
numArr.splice(numArr.indexOf(largeNum), 1);
return numArr.length === 1 ? newNum += numArr[0] : arrToString();
}
arrToString();
return Number(newNum);
}
- if, for 문을 쓴거보다 모든케이스에서 시간이 조금씩 더 걸렸다