문자열 정렬하기 (1) (return 연습하기)

HS K·2023년 3월 2일

문제설명

문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.

제한사항

  • 1 ≤ my_string의 길이 ≤ 100
  • my_string에는 숫자가 한 개 이상 포함되어 있습니다.
  • my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루어져 있습니다.

내가 쓴 답

function solution(my_string) {
    let arr = [];
    for(let i=0; i<my_string.length; i++) {
        if(typeof (my_string[i])=="number") {
            return my_string[i]
        }
        arr.push(my_string[i])
    }
    return arr
}

※ 참고로 틀린 답이다. 어디가 틀렸을까?

  1. 문자열의 인덱스에 접근하면 반환되는 값은 문자이다. 따라서 typeof가 아니라 isNaN 함수를 사용하여 숫자를 확인해야 합니다.

  2. 또한 숫자를 골라내면, 해당 숫자를 arr 배열에 추가해야 한다. 그러나 주어진 코드에서는 숫자를 찾으면 즉시 반환되기 때문에 이 부분이 수정되어야 한다. 숫자를 찾으면 arr.push 함수를 사용하여 arr 배열에 추가하도록 코드를 변경해야 한다.

두번째 시도

function solution(my_string) {
    let arr = [];
    for(let i=0; i<my_string.length; i++) {
        if(!isNaN(my_string[i])) {
            return my_string[i]
        }
        arr.push(my_string[i])
    }
    return arr.sort((a,b)=>a-b)
}

이 코드는 isNaN 함수로 문자열의 i번째 인덱스가 숫자인지 확인하고, 숫자라면 즉시 반환하게 되어있습니다. 이로 인해 숫자를 모두 찾지 못하고, 문자열에서 첫 번째 숫자만 반환하고 함수가 종료되므로 정확한 결과를 얻을 수 없다. (이런 실수를 자주 저지른다. 아직 원리가 머릿속에 안잡혔다)

해결책은 숫자를 찾은 후 return 문을 사용하여 함수를 즉시 종료하는 것이 아니라, 숫자를 arr 배열에 추가한 후 마지막에 arr을 오름차순으로 정렬하여 반환해야한다.

수정한 답

function solution(my_string) {
    let arr = [];
    for(let i=0; i<my_string.length; i++) {
        if(!isNaN(my_string[i])) {
            arr.push(parseInt(my_string[i]))
        }        
    }
    return arr.sort((a,b)=>a-b)
}

여러종류의 풀이 보기

function solution(my_string) {
    return my_string.match(/\d/g).sort((a, b) => a - b).map(n => Number(n));
}

후기

return 위치 연습하기. 반환을 어디에 해주느냐에 따라 값이 달라진다. return에 대한 개념을 연습할 수 있었다.

profile
주의사항 : 최대한 정확하게 작성하려고 하지만, 틀릴내용이 있을 수도 있으니 유의!

0개의 댓글