프로그래머스 LEVEL 1 에 있는 문제이다.



function solution(s) {
// s가 의미하는 원래 숫자를 return 하도록 작성
// 영단어를 숫자로 변경
var words = s
.replace(/zero/gm, 0)
.replace(/one/gm, 1)
.replace(/two/gm, 2)
.replace(/three/gm, 3)
.replace(/four/gm, 4)
.replace(/five/gm, 5)
.replace(/six/gm, 6)
.replace(/seven/gm, 7)
.replace(/eight/gm, 8)
.replace(/nine/gm, 9);
var answer = parseInt(words);
return answer;
}

처음엔 배열을 만들어서 풀어볼까 접근했다가, 바로 전에 푼 "신규 아이디 추천" 에서 정규식을 사용하여 풀었던 문제가 생각나서 정규식을 이용해서 풀어봤다.
zero 부터 nine 까지 문자를 각 문자에 맞는 숫자로 바꿔주었다.
정규식을 활용하여 쉽게 풀 수 있는 문제였다!
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);
}
정규식을 사용하지 않고 배열을 사용하여 푸신 분의 코드이다.
먼저 zero 부터 nine 까지의 문자열을 담고있는 배열을 만들고, answer에는 테스트 코드들을 받아온다.
for문으로 들어가서 split을 이용하여, 각 문자열에 해당하는 값을 기준으로 잘라준다.
예를들어 one4seveneight 가 answer에 들어왔다고 하면, for문 초기식이 i = 1 일 때,
"one"을 기준으로 배열을 잘라준다. 이 때 "one"을 기준으로 하기때문에 "one"이 없어지고,
arr은 ["", "4seveneight"] 이상태가 될것이다. 그 다음 join 메서드를 이용하여 배열을 문자열로 합쳐준다.
join 메서드에 파라미터를 넣게되면, 구분되어 있는 배열 사이에 파라미터로 넣어준 값이 들어가게된다.
즉 현재 ["", "4seveneight"] 이 상태에서, join(1)을 해주게되면
"14seveneight" << 이렇게 치환된다.
["", "4seveneight"] 이 배열의 ,(콤마) < 이 부분을 1로 대체하여 하나의 문자열로 만든다는 뜻이다.
이걸 반복문을 통해서 하게되면, 각 문자에 해당하는 값들은 공백으로 바뀔것이고 ("") 그 때마다 조인으로 해당 문자에 해당하는 인덱스값으로 join을 해줘서 one4seveneight 은 1478으로 변환되는것이다!
여기까지 다른 사람의 코드까지 해석해보았다. 개인적으로 이 방법이 마음에 든다!
뭔가 근본있는 방법같은 느낌..? 코드도 깔끔하고 아이디어가 정말 좋은것같다.