🙌문제설명
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 영단어
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
☑️나의 풀이
먼저 문자와 숫자 구분해주기
1. split, join 조합 - split으로 나눈다음, 문자열을 숫자와 매칭하는 방법을 못생각해냈다.
2. replace 조합 - 10개 모두 일일히 작성해준다.
**문제점 발생
정규표현식 /문자/gi 가 아닌, '문자' 로 작성했을때는 실패했다. 왜일까?
ex) oneoneonezero 일 경우
- 정규표현식으로 하면 1110 으로 변환되지만
- 문자열로 작성했을때는 1oneone0으로 변환된다
function solution(s) {
var ans = 0;
ans = 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(ans);
}
☑️다른 사람의 풀이
영어단어를 배열에 넣으면, index 값과 같다는 것을 보았다..!!
while 문으로 돌면서 배열값을 만나면 split 하고, 배열값의 idx로 바꿔서 join 한다.
function solution(s) {
const num = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
for(let i=0; i<num.length; i++){
s = s.split(num[i]).join(i);
}
return Number(s);
}
for 문 로직
현재 숫자 단어 num[i] 를 기준으로 s 를 분리한다.
분리된 요소를 idx 값, 즉 i 로 합친다
ex) oneoneonezero라면
1. num[i]가 zero, i=0 일때
s.split('zero')는 ["oneoneone', ""], join(0) 으로 "oneoneone0" 이 된다
2. num[i]가 one, i=1 일때
s.split('one')는 ["", "", "", "0"], join(1) 으로 "1110" 이 된다
3. num[i]가 two, i=2 일때
s.split('two')는 1110에서 two가 없으므로 나누고, 합치지 않는다.
4........
☑️배운 점
val이 0123... 일때는 배열로 생각해보기
replace() 여러개 풀이법
replace( 1 | 2 | 3, 0)으로 1, 2, 3 값을 한번에 0으로 바꾸는 작성법도 있다.