반응형
프로그래머스 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
반응형
'프로그래밍 > Algorithm' 카테고리의 다른 글
[C++/프로그래머스] 숫자의 표현 (0) | 2022.10.07 |
---|---|
[C++/백준] 11725번: 트리의 부모 찾기 | BFS (0) | 2022.08.26 |
[JavaScript/프로그래머스] 소수 만들기 (0) | 2022.07.15 |
[JavaScript/프로그래머스] K번째수 (0) | 2022.07.13 |