프로그래머스 L1 - 숫자 문자열과 영단어

2024. 3. 24. 15:04알고리즘/프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


function solution(s) {
    const map = new Map([['zero',0],['one',1],['two',2],['three',3],['four',4],['five',5],['six',6],['seven',7],['eight',8],['nine',9]]);
    let ret = "";
    let tmp = "";
    [...s].forEach((c)=>{
        if(!Number.isNaN(Number(c))) ret+=c;
        else{
            tmp+=c;
            if(map.has(tmp)){
                ret+=String(map.get(tmp));
                tmp = "";
            }
        }
    })
    return Number(ret);
}

어렵지 않은 문제이다.

문자에 매핑된 숫자를 찾아서 바꿔주기만 하면 된다.

Number.isNaN을 이용해서 숫자인 문자는 그대로 ret에 더해주고, 숫자가 아닌 문자는 매핑된 숫자를 찾아서 ret에 더해준다.

 

다른 사람의 코드를 찾아보던 중, 정말 놀라운 코드가 있어 정리한다.

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과 join의 정확한 이해가 있어야 활용할 수 있는 코드이다.

split(",") 는 ,를 기준으로 문자열을 나눠서 배열로 반환한다는 의미이다.

"a b"를 split(" ") 하면 [a, b] 가 된다. 공백을 기준으로 문자열을 구분했기 때문이다.

만일 "one4seveneight" 라는 문자열이 있고 split("one")을 하면 "one"을 기준으로 문자열을 나눠 배열을 반환한다.

그렇다면 ["", "4seveneight"] 이렇게 문자열이 분리된다.

여기서 join(i)는 i를 기준으로 배열 요소를 합쳐서 문자열로 반환하는 것이다.

"one"의 인덱스는 1이므로 join(1)을 하게되면  ["", "4seveneight"]  ➡ "14seveneight" 이렇게 문자열이 반환된다. 

단순히 split을 문자열을 배열로 바꾸고, join으로 배열을 다시 문자열로 합치는 기능으로만 사용했는데 이렇게도 활용할 수 있다.