1. 문제
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 1478 → "one4seveneight"
- 234567 → "23four5six7"
- 10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 | 영단어 |
0 | zero |
1 | one |
2 | two |
3 | three |
4 | four |
5 | five |
6 | six |
7 | seven |
8 | eight |
9 | nine |
2. 나의 풀이
function solution(s) {
let numArr = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
for (let i = 0; i < numArr.length; i ++) {
s = s.replace(new RegExp(`${numArr[i]}`, 'g'), i)
}
return Number(s);
}
- 0에서 9까지 총 10번을 replace를 사용해서, 문자열을 해당하는 숫자로 변경한다.
- 처음에는 10줄 일일이 다 replace를 하나씩 쓰려고 했지만, 반복문을 활용
- 반복문을 활용하기 위해서, 숫자 배열을 만들어서 i = 0에 맞게 zero부터 시작하는 숫자 배열 작성
- 반복문을 돌면서 인덱스의 값에 맞는 단어가 있는지 확인 후, 해당 인덱스의 숫자로 변경
- 문제는 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);
}
예를 들어 one4seveneight라는 문자열을 반복문을 돌렸을 때, i가 1일때, arr는 ["" , "4seveneight"]로 나뉘어 진다. 그리고 나서, join은 배열의 모든 요소를 연결하는데, 인자로 특정 문자열을 전달하면, 그 문자열로 요소를 연결한다. 그렇기 때문에 14seveneight가 된다. 그렇게 반복문을 돌면서, 문자열이 있으면 split하고 해당 인덱스를 join해서 숫자값으로 바꾸어 준다...
크으.. 공부공부..
'리코딩 : 알고리즘' 카테고리의 다른 글
14. 프로그래머스 - 다트게임 (0) | 2021.10.05 |
---|---|
13. 프로그래머스 - 2019 KAKAO BLIND RECRUITMENT 오픈채팅방 (0) | 2021.10.04 |
11. 프로그래머스 - [카카오]비밀지도 (0) | 2021.10.01 |
10. 프로그래머스 - 신규 아이디 추천 (0) | 2021.09.28 |
9. 프로그래머스 - 음양더하기 (0) | 2021.09.25 |