[프로그래머스] 숫자 문자열과 영단어
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
문제의 규칙(?)은 이러하다.
** Javascript
씐난다. 이번에도 풀고 나서 엄청 뿌듯했다.
댓글 달린 날짜들 보니까 대부분 7월 초-중순이다. 2021 카카오 문제인 것만 알았는데 생각보다 올라온 지 얼마 안 된 문제였나 보다.
내 풀이는 이렇다.
function solution(s) {
const numbers = [
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"
];
for (const number of numbers) {
s = s.replace(new RegExp(`${number}`,'g'), numbers.indexOf(number));
}
return Number(s);
}
일단 숫자들을 index대로 배열 안에 나열해놓았다.
그래서 numbers.indexOf("zero") 하면 0 나오고 numbers.indexOf("seven") 하면 7이 나올 수 있도록!
시간이 조금 걸렸던 부분은 replace 함수 안에 넣을 정규식 부분이었는데
나는 비교할 문자열이 변수로 들어가 있어서 /숫자문자열/g 이걸 넣을 수가 없었다.
// <- 이 안에 들어가면 백틱(`)도 소용이 없다.
문자열 전체 비교를 하려면 /g 글로벌 조건을 걸어야 하기 때문에 방법을 찾아내는 데 조금 걸렸다.
javascript replace regular expression constructor 이렇게 찾다가 얻어걸린 RegExp!
https://developer.mozilla.org/ko/docs/orphaned/Web/JavaScript/Reference/Global_Objects/RegExp
RegExp | MDN
RegExp 생성자는 패턴을 사용해 텍스트를 판별할 때 사용합니다.
developer.mozilla.org
제가 원한 건 이 설명이었죠
RegExp.prototype.global (en-US)정규 표현식이 문자열 내에서 가능한 모든 경우에 일치하는지, 아니면 최초에 대해서만 일치하는지 나타냅니다.
그래서 저 하이퍼링크를 타고 들어간 게 아래 사이트다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/global
RegExp.prototype.global - JavaScript | MDN
The global property indicates whether or not the "g" flag is used with the regular expression. global is a read-only property of an individual regular expression instance.
developer.mozilla.org
모질라의 데모 소스를 보면
const regex1 = new RegExp('foo', 'g');
console.log(regex1.global);
// expected output: true
const regex2 = new RegExp('bar', 'i');
console.log(regex2.global);
// expected output: false
이렇게!! g를!! 쓸 수 있다!!!
예시를 더 보면
replace 에 어떻게 적용해야 하는지까지도 친절하게 알려준다!
추천이 가장 많은 다른 풀이를 보면
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);
}
여기도 배열의 인덱스 특성을 활용하였는데 굳이 정규식을 쓰지 않아도 되는 참신한 방법이었다.
s 에 포함되어 있는 문자열로 split을 하면 문자열 전후로 s 가 분리되면서 배열 형태로 리턴된다.
그리고 그 과정에서 포함되어있던 문자열은 자연스럽게 제거된다.
문자열 대신 index를 넣어 join 하면 끝인데
결과적으로 문자열이 숫자로 자연스럽게 치환되어 보인다.
세상에 머리 좋은 사람들은 많다.
접근성을 길러야겠다. 같은 문제도 더 쉽게 풀 수 있는 방법으로