TIL

23.04.13 TIL

DDINYOUNG 2023. 4. 18. 16:11

입출력 예

s result
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

 

내가 작성한 코드

function solution(s) {
    var answer = [];
    let numList = ['zero','one','two','three','four','five','six','seven','eight','nine']
    let vocab = ""
    let str = s.split("")
    
    for(let a of str){
        if(isNaN(parseInt(a))){
            vocab += a;
            if(numList.includes(vocab) === true){
                answer.push(numList.indexOf(vocab))
                vocab = ""
            }
        } else {
            answer.push(parseInt(a))
        }
    }
    let newAnswer = ""
    for(let b of answer){
        newAnswer += b
    }
    return Number(newAnswer)
}

numList를 만들고 s를 split해서 배열로 만들고 해당 요소를 문자열인지 숫자인지 판단 후

숫자는 그냥 넣어주고 문자열은 vocab에 담아서 numList에 포함되는 문자열은 해당 인덱스를 문자열 대신 넣어준다.

 

이렇게 풀면 문제점…

문자열이 담긴 배열이라 다시 한번 풀어헤쳐서 배열→문자열→숫자로 변경해줘야 됨. 너무 복잡하다;;

 

다른 사람의 풀이 #1

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);
}

내가 푼 방법의 상위 버전인 것 같다. numbers의 요소로 split 해서 문자열을 쪼개준 다음 해당 인덱스로 넣어주고 join으로 다시 합쳐줌..

 

다른 사람의 풀이 #2

function solution(s) {
    s = s.replace(/zero/g, 0)
    .replace(/one/g, 1)
    .replace(/two/g, 2)
    .replace(/three/g, 3)
    .replace(/four/g, 4)
    .replace(/five/g, 5)
    .replace(/six/g, 6)
    .replace(/seven/g, 7)
    .replace(/eight/g, 8)
    .replace(/nine/g, 9)
    return parseInt(s);
}

정규식으로 replace하기…

replace사용하는 것은 맨 처음에 생각하기는 했는데, split을 하자니 배열이 되서 replace를 못 사용하고 slice를 사용하자니 다시 붙이는게 번거로울것같았는데 replace 정규표현식이 있었다

 

정규식 뒤에 붙는 / /g는 대소문자를 구분하지 않는다는 의미이고

/ /gi는 대소문자도 구분한다.