프로그래머스 알고리즘 LV.1 - 정수 내림차순으로 배치하기

roadzmoon76·2022년 1월 31일
0

알고리즘

목록 보기
4/6

https://programmers.co.kr/learn/courses/30/lessons/12933

📕 나의 풀이

  1. 숫자를 배열로 바꾸기
  2. 배열에서 가장 큰 수를 찾고, 그 수를 새로운 스트링에 넣어준후 배열에서 제거하는 함수를 만들고
  3. 그 함수가 배열의 요소가 하나 남을때까지 계속 실행되도록 재귀함수로 리턴값에 넣어주기
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 문으로 바꿔보기로 함

📕 수정한 나의 풀이 2


  • 이번엔 런타임 에러는 안났지만, 똑같이 테스트 7 이 실패가됨 ㅠㅠ
  • 잘 찾아보니 n이 한자리수일때 문제가 있는 코드였다

📕 수정한 나의 풀이 3

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 문을 쓴거보다 모든케이스에서 시간이 조금씩 더 걸렸다

📘 다른사람 풀이

profile
크론병걸린 자퇴생, 개발자되기

0개의 댓글