코딩테스트

[JS] 2021 카카오 채용연계형 인턴십 > 숫자 문자열과 영단어

차차한 2022. 8. 5. 15:37

영단어 숫자가 포함된 문자열을 모두 숫자로 변경해야 하는 문제

주의할 점

1. oneone4one 처럼 한 영단어가 여러 번 사용될 때도 모두 숫자로 변환해야 함

2. 리턴타입은 문자열이 아닌 넘버

function solution(s) {
    answer = 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(answer);
}

첫 번째 문제 풀이

문자단어를 숫자로 바꿔야하기 때문에 replace를 사용했다.

처음에는 s.replace("zero", 0)...replace("nine",0)으로 작성했는데 몇몇 테스트케이스는 계속 오류가 발생했다.

왜 그런지 계속 생각을 해보니 oneone4one처럼 한 문자가 여러번 쓰일 경우에는 제일 앞에 있는 단어만 변경되어 1one4one처럼 됐다.

정규식을 사용해 모든 문자에 대해 replace가 적용되도록 바꿨다.

이때도 정규식을 어떻게 써야하는지 잊어버려서 "/zero/"g 이런식으로 썼다... ㅠ

참고로 /zero/ig는 대소문자 구별없이 모든 zero에 대해 적용하는 것!

아무튼 이렇게 코드를 작성하니 채점 완료


function solution(s) {
    let reg = [/zero/g, /one/g, /two/g, /three/g, /four/g, /five/g, /six/g, /seven/g, /eight/g, /nine/g];
    
    for(var i = 0; i < reg.length; i++){
        s = s.replace(reg[i], i);
    }
    return parseInt(s);
}

두 번째 풀이방법

다른 사람이 푼 문제 중에 이런 식으로 배열과 for문을 이용해 문제를 푸는 방법도 있어서 해봤다.

배열과 반복을 하니 replace만 메소드체이닝했을 때보다는 깔끔해보인다.

그런데 처음에는 for문에서

for(var i = 0; i < reg.length; i++){
    answer = s.replace(reg[i], i);
}

위에 처럼 작성을 했었는데 계속 오류가 발생했다.

s가 zeroone2이고 i가 0일 때 let answer = s.replace(reg[i], i);를 실행하면 answer = 0one2가 된다.

그런데 i가 1이 될 때 다시 s에 대해 replace를 하는데 s는 그대로 zeroone2다.

answer에만 값이 들어가고 그거를 리턴하니까 당연히 안 되는 거였다.

s에 다시  answer 값을 담게 s=answer 문장을 추가했는데

생각해보니 s에다가 바로 값을 담으면 해결되는 문제였다.

2번 코드는 훨씬 간단해보였는데 반복을 돌려서 그런건지 1번 코드와 2번 코드 문제풀이 시간은 비슷하게 나왔다.