네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
첫번째 시도
function solution(s) {
const numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
let str = "";
for (let i = 0; i < s.length; i++) {
if (Number(s[i])) {
answer += s[i];
} else {
str += s[i];
if (numbers.includes(str)) {
answer += numbers.indexOf(str);
str = "";
}
}
}
return Number(answer);
}
테스트 10번에서만 실패했다.
아무래도Number(s[i])
로만 해당 값을 확인하는 것이 찝찝했다.
해결
function solution(s) {
const numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
let str = "";
for (let i = 0; i < s.length; i++) {
let found = s[i].match(/[a-z|A-Z]/);
if (found === null) {
answer += s[i];
} else {
str += s[i];
if (numbers.includes(str)) {
answer += numbers.indexOf(str);
str = "";
}
}
}
return Number(answer);
}
정규표현식을 이용해서 영어 대,소문자가 아닐 때는
answer
에 값을 더해주는 방식을 사용했다.
영어 대, 소문자일 때는str
변수에 추가해주고 해당 값이numbers
배열에 있는지 확인하고 있으면index
를 찾아서answer
에 더해주는 방식으로 구현했다.
그리고str
을 초기화했다.
프로그래머스 풀이
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++) {
// numbers[i]로 split했을 때 split이 되면 빈문자열과 나머지 문자열을 가진 배열로 반환한다.
let arr = answer.split(numbers[i]);
// 빈 문자열 자리를 i로 join한다.
answer = arr.join(i);
}
return Number(answer);
}
split
을 이런식으로 사용하는 것을 보고 놀라웠다..!
주어진s
에 접근하지 않고numbers
배열을 통해 접근하는 방식을 생각하는 것이 어려울 것 같다.
아무래도 아직은 알고리즘을 많이 접하지 않아서 그런 것 같다.
split
하고 바로join
하면 해당index
를 찾을 필요도 없고,includes
를 통해서 있는지 확인할 필요도 없다.
split
하면 해당 값이 있을 때와 없을 때의return
값이 달라지기 때문이다.