728x90
문제 설명
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 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로 주어집니다.
입출력 예
"one4seveneight" | 1478 |
"23four5six7" | 234567 |
"2three45sixseven" | 234567 |
"123" | 123 |
나의 풀이
function solution(s) {
let answer ='',str='';
let num=["zero","one","two","three","four","five","six","seven","eight","nine"]
s=s.split("")
for(let i=0;i<s.length;i++){
if(s[i]>=0&&s[i]<=9)answer+=s[i]
else{
str+=s[i]
if(num.includes(str)){
answer+=num.indexOf(str)
str=''
}
}
}
return Number(answer);
}
풀이전략
- 입력받은 s를 split(””)로 배열로 분리하였다.
- 반복문으로 배열을 돌면서 숫자인 경우 answer에 문자열 형태로 더하고 문자일 경우 str이라는 문자열 변수에 집어넣은 후 한 숫자 단어가 완성이 되면 answer에 인덱스를 더한다. (인덱스가 그 숫자 단어의 숫자임)
- 한 단어의 숫자 변환이 끝났으면 str을 초기화 해준다
- answer은 문자열 형태이므로 숫자로 형 변환 후 return
참고
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);
}
깔끔 그 자체이고 이해하기도 쉽다
answer에 입력받은 s를 넣고 원하는 숫자 단어로 각각 자른 다음 부분을 i로 join()시키면 문자 단어가 숫자 단어로 바뀌게 된다
똑같은 배열 순회이지만 이 풀이는 numbers를 순회하여 10만큼만 순회하면 되지만 나는 s를 순회하는 풀이를 사용했기 때문에 s의 최대 길이 50만큼 순회할 수도 있다.
시간 복잡도 면에서도 가독성, 이해 면에서도 이 풀이가 더 멋진 풀이이다.
review)
split(””)과 join(””)은 배열을 만들고 문자열로 만드는 용도로만 사용하지 말고 어떤 문자로 묶고 해체하는 사용법도 익숙해지자
728x90