네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
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 |
1 ≤ s의 길이 ≤ 50
s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
s | result |
---|---|
"one4seveneight" | 1478 |
"23four5six7" | 234567 |
"2three45sixseven" | 234567 |
"123" | 123 |
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
문제 예시와 같습니다.
입출력 예 #3
"three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.
입출력 예 #4
s에는 영단어로 바뀐 부분이 없습니다.
제한시간 안내
정확성 테스트 : 10초
/*문자를 정의
문자를 찾는다
문자에 대응하는 숫자로 바꿔준다
*/
function solution(s) {
const eng = ['zero','one','two','three','four','five','six','seven','eight','nine']
function engToNum(str){
for(let i = 0; i < eng.length ; i++){
if(str === eng[i])
return i
}
}
return s.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g,engToNum) * 1;
}
사실 마땅한 방법이 생각이 안 나서 좀 가독성이 떨어지게 풀었다. zero~nine의 문자를 찾아서 함수를 통과시켜 줬다. 이 함수는 문자를 배열에서 찾아준 다음, 그 문자의 인덱스를 반환시켜주는 함수이다.
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);
}
replace()
대신에 split()
과 join()
을 이용하여 문자를 검사한 후 바꿔주었다. split()
은 문자를 지정한 기준으로 나눈 뒤 배열으로 반환해준다. 인수를 넣어주면 인수를 띄어쓰기의 기준으로 삼기 때문에 문자를 넣어주면 원래 배열에서 그 문자가 사라지고, 공백과 나머지 문자의 배열을 반환한다. 만약 존재하지 않는 문자를 넣는다면 문자를 그냥 배열로 바꾸어서 반환한다.
console.log('one2three'.split('one'))
//['','2three']
console.log('one2three'.split('zero'))
//['one2three']
그리고 split()
으로 나눈 값에 join()
을 이용하여 값을 더해 준다. 그러면 앞쪽에 join의 인수를 더해 주는데, 배열의 요소가 두 개 밖에 없고 그 요소를 이어주는 자리에 값을 넣어주기 때문에 결국 앞부분에 숫자가 붙는 것이다.
console.log(['','2three'].join(1));
//12three
이것을 반복해서 전체 배열을 검사하면 문자가 숫자로 바뀌어서 나오게 된다. 문자로 나오기 때문에 마지막에 number()
을 사용해서 숫자로 바꾸어 줬다.
function solution(s) {
s = s.replace(/zero/gi, 0)
.replace(/one/gi, 1)
.replace(/two/gi, 2)
.replace(/three/gi, 3)
.replace(/four/gi, 4)
.replace(/five/gi, 5)
.replace(/six/gi, 6)
.replace(/seven/gi, 7)
.replace(/eight/gi, 8)
.replace(/nine/gi, 9)
return parseInt(s);
}
어차피 replace를 사용해서 나열을 할 거라면 굳이 함수를 만들지 않고 이런식으로 쓰는 게 가독성이 나을 수 있겠다는 생각이 든다.