function solution(s) {
const englishNum = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
let answer = s;
for (let i = 0; i < 10; i++) {
answer = answer.replace(englishNum[i], i.toString());
}
return parseInt(answer);
}
테스트 케이스 3개를 통과하지 못하는 걸 보고 replace
함수 관련 놓치고 있는 게 있다는 생각이 들었다.
s = 'one1one4seven';
console.log(s.replace('one', 1));
// 실행 결과: '11one4seven'
예상했던대로 replace
함수는 문자열에서 처음으로 일치하는 부분만 교체해준다.
이를 고려해 전체 문자열에 더이상 문자가 없을 때까지 replace
해주는 작업을 반복하도록 코드를 수정해봤다.
+) 최근 ES2021부터 replaceAll()
함수를 사용할 수 있다고 들었다! 😮
s = 'one1one4seven';
console.log(s.replaceAll('one', 1));
// 실행 결과: '1114seven'
테스트해보니 매우 잘되지만 프로그래머스에 replaceAll()
을 사용한 코드를 제출하려고 하면
TypeError [Error]: answer.replaceAll is not a function
이런 에러가 뜬다! 코테에서 사용하기에는 너무 이른 듯하다.
function solution(s) {
const englishNum = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
let answer = s;
while (Number.isInteger(s*1) === false) {
for (let i = 0; i < 10; i++) {
answer = answer.replace(englishNum[i], i);
}
}
return answer*1;
}
응... 시간초과야...
쓰면서도 좋은 방법은 아니다 싶었는데 역시 ^^...
function solution(s) {
const len = s.length;
const englishNum = {'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9}
let answer = '';
let temp = '';
for (let i = 0; i < len; i++) {
if (Number.isInteger(s[i]*1)) {
answer += s[i];
} else {
temp += s[i];
}
if (Number.isInteger(englishNum[temp])) {
answer += englishNum[temp];
temp = '';
}
}
return answer*1;
}
영단어와 숫자를 이어둔 object와 영단어를 체크할 수 있는 배열을 이용해서 해결!
https://programmers.co.kr/learn/courses/30/lessons/81301?language=javascript