[프로그래머스 | Javascript] 2021 카카오 채용연계형 인턴십 - 숫자 문자열과 영단어

박기영·2022년 9월 14일
0

프로그래머스

목록 보기
51/159
post-custom-banner

solution

function solution(s) {
    let ans = "";
    
    // 숫자를 의미하는 문자열을 만들기 위한 빈 배열
    let str = "";
    
    let inputs = s.split("");
    
    while(inputs.length > 0){
        let input = inputs.shift();
        
        // 만약 숫자가 온다면 그대로 ans에 더해준다.
        if(input.charCodeAt() >= 48 && input.charCodeAt() <= 57){
            ans += `${input}`;
            
            // 다음 문자열로 넘어간다.
            continue;
        }
        
        // input을 str 배열에 넣는다
        str += `${input}`;
        
        // 만약 숫자로 표현될 수 있는 문자열이 나온다면 ans에 숫자를 더해준다.
        if(str === "one"){
            ans += "1";
            
            // str 배열을 초기화한다.
            str = "";
        } else if(str === "two"){
            ans += "2";
            
            str = "";
        } else if(str === "three"){
            ans += "3";
            
            str = "";
        } else if(str === "four"){
            ans += "4";
            
            str = "";
        } else if(str === "five"){
            ans += "5";
            
            str = "";
        } else if(str === "six"){
            ans += "6";
            
            str = "";
        } else if(str === "seven"){
            ans += "7";
            
            str = "";
        } else if(str === "eight"){
            ans += "8";
            
            str = "";
        } else if(str === "nine"){
            ans += "9";
            
            str = "";
        } else if(str === "zero"){
            ans += "0";
            
            str = "";
        }
    }
    
    return Number(ans);
}

어렵지않은 문제였다.
s로 주어진 입력 데이터를 쪼개서 string 타입 원소를 가지는 배열로 변환하고,
숫자가 input으로 들어오면 그대로 ans에 넣으며,
문자가 들어오면 str에 넣어준다.

str을 지속적으로 체크해서 "one", "two", ...처럼 주어진 문자열로 완성되면
해당 문자열에 맞는 숫자를 ans에 넣어준 뒤
다음 문자열을 판단하기 위해 str을 초기화한다.

출력은 number 타입이므로, Number(ans)를 반환해야한다.

다른 분 풀이

function solution(s) {
    let numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
    var answer = s;

    for(let i=0; i< numbers.length; i++) {
        let arr = answer.split(numbers[i]);
        answer = arr.join(i);
    }

    return Number(answer);
}

필자가 처음 시도 때 split()으로 했다가 포기했는데, 이렇게 했어야했나보다.
split()에 numbers에 있는 문자열을 넣어서 배열을 만든다.
예를들어,

"one2three".split("one")

을 하면

["", "2three"]

가 된다.
split() 내부에 있는 것을 기준으로 문자열을 잘라내기 때문에
내부에 있던 부분을 기준으로 2개의 문자열이 나오게 되는 것이다.

이를 i로 join을 하는데,
i는 인덱스 번호인데, numbers 배열 자체가 인덱스 번호의 문자열 버전을 의미하므로

"12three"

가 된다.

join() 내부에 있는 것으로 배열 원소들이 조합된다는 점을 이용한 것이다.
쉽게 말하면

"" + "1" + "2three"

인 것이다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글