Binary Journey

[프로그래머스] 숫자 문자열과 영단어 본문

프로그래머스/level 1

[프로그래머스] 숫자 문자열과 영단어

binaryJournalist 2021. 7. 21. 23:21
반응형

출처: 프로그래머스 코딩 테스트 연습, 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 하면 끝인데

 

결과적으로 문자열이 숫자로 자연스럽게 치환되어 보인다.

 

 

 

 

세상에 머리 좋은 사람들은 많다.

 

 

 

접근성을 길러야겠다. 같은 문제도 더 쉽게 풀 수 있는 방법으로

반응형