function solution(s) {
s = s.replace(/zero/gi, 0)
.replace(/one/gi, 1)
.replace(/two/gi, 2)
.replace(/three/gi, 3)
.replace(/four/gi, 4)
.replace(/five/gi, 5)
.replace(/six/gi, 6)
.replace(/seven/gi, 7)
.replace(/eight/gi, 8)
.replace(/nine/gi, 9)
return parseInt(s);
}
어렵게 생각했는데 단순히 하나하나 replace로 체이닝 하는게 제일 간단했다
- g global = > 지정된 정규표현식을 여러번 찾는다는 뜻
- one 등이 여러번 나올수 있기 때문에 꼭 global로 설정해 줘야한다
- i는 대소문자를 구분하지 않는다는 것인데 문제에서 꼭 필수는 아니지만 좀 더 범위를 늘려주고 싶다면 설정해 주는게 좋다
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);
}
내장함수, index를 적절하게 사용한 정말 훌륭한 예시가 아닐까 싶다
해당 인덱스의 단어가 문자열에 있다면 제거해주고 해당 인덱스로 join을 해준다
split() 메서드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다. - > separator마다 끊은 부분 문자열을 담은 Array.
- 문자열에서 separator가 등장하면 해당 부분은 삭제되고 남은 문자열이 배열로 반환됩니다.
- separator가 등장하지 않거나 생략되었을 경우 배열은 원본 문자열을 유일한 원소로 가집니다.
- separator가 빈 문자열일 경우(""), str은 문자열의 모든 문자를 원소로 가지는 배열로 변환됩니다.
- separator가 원본 문자열의 처음이나 끝에 등장할 경우 반환되는 배열도 빈 문자열로 시작하거나 끝납니다.
- 그러므로 원본 문자열에 separator 하나만이 포함되어 있을 경우 빈 문자열 두 개를 원소로 가지는 배열이 반환됩니다.
- 만약 s가 "one2three"라고 가정하자
- answer에 s를 할당해준다
- numbers배열에 대해 for문을 도는데 i=1(numbers[1]="one")일때
answer.split(numbers[1]) 을 하면 answer는 "one"을 기준으로 쪼개진 배열인 ["","2three"]을 return 하게 된다
join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.
() 괄호 안 = > separator (Optional)
배열의 각 요소를 구분할 문자열을 지정합니다. 이 구분자는 필요한 경우 문자열로 변환됩니다. 생략하면 배열의 요소들이 쉼표로 구분됩니다. separator가 빈 문자열이면 모든 요소들이 사이에 아무 문자도 없이 연결됩니다.
["", 2three] 를 해당 index인 1로 join하게 되면 "12three"가 된다
join은 string을 return해서 꼭 parseInt 나 Number 사용해서 숫자로 만들어 줘야한다
index가 3일때 split(numbers[3]) 후 [12,""] = > index로 join후 "123" 이된다