[JS] 2021 카카오 채용연계형 인턴십 > 숫자 문자열과 영단어
영단어 숫자가 포함된 문자열을 모두 숫자로 변경해야 하는 문제
주의할 점
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번 코드 문제풀이 시간은 비슷하게 나왔다.