프로그래밍/Algorithm

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

choar 2022. 7. 30. 23:43
반응형

프로그래머스 1단계 문제인 '숫자 문자열과 영단어'를 자바스크립트로 풀어보았다.

 

[문제 설명]
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

 

function solution(s) {
    const NUM_MAP = {
        zero: 0,
        one: 1,
        two: 2,
        three: 3,
        four: 4,
        five: 5,
        six: 6,
        seven: 7,
        eight: 8,
        nine: 9
    };
    
    for (const [key, value] of Object.entries(NUM_MAP)) {
        s = s.replace(new RegExp(key, "g"), value.toString());
    }
    
    return parseInt(s, 10);
}

 

이 문제에서는 객체(Object), String.prototype.replace() 메서드, 정규표현식 객체(RegExp)를 활용하였다.

 

일단 각 숫자와 영단어를 맵핑하는 NUM_MAP이라는 객체를 만들었다.

Object.entries() 메서드와 구조 분해 할당을 활용해 NUM_MAP을 순회하는 반복문을 만들어주었고,

그 안에서 원본 문자열의 숫자 영단어를 숫자로 변경해주었다.

for (const [key, value] of Object.entries(NUM_MAP)) {
    // X
    s = s.replace(key, value.toString());
    // O
    s = s.replace(new RegExp(key, "g"), value.toString());
}

이때 String.prototype.replace() 메서드를 활용하는 데 있어 실수가 있었다.

 

// String.prototype.replace() 구문
let newStr = str.replace(pattern, replacement);

replace 메서드의 첫 번째 파라미터는 pattern, 두 번째 파라미터는 replacement이다.

replace 메서드는 주어진 문자열(. 앞)에 있는 pattern을 replacement로 교체해준다.

이때, pattern으로 (1) 문자열 또는 (2) 정규표현식을 사용할 수 있는데,

문자열을 입력할 경우 오직 첫 번째 일치되는 문자열만이 변경된다.

즉, "oneoneoneone"같은 문자열의 경우 "1111"로 변경되어야 하는데 "1oneoneone"으로 변경된다.

pattern을 정규표현식을 이용하는 방식으로 변경해 문제 풀이에 성공했다.


References

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace

반응형