네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
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 |
s | result |
---|---|
"one4seveneight" | 1478 |
"23four5six7" | 234567 |
"2three45sixseven" | 234567 |
"123" | 123 |
입출력 예 #1
입출력 예 #2
입출력 예 #3
입출력 예 #4
function solution(s) {
var answer = "";
var eng = "";
const arr = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
];
for (let i = 0; i < s.length; i++) {
if (isNaN(s[i]) == false) {
answer += s[i];
} else {
eng += s[i];
for (let j = 0; j < arr.length; j++) {
if (eng == arr[j]) {
answer += j;
eng = "";
}
}
}
}
return Number(answer);
}
먼저 숫자와 영어가 대응하는 배열을 하나 만들었다.
어차피 인덱스와 똑같이 대응하기 때문에 순서대로 영어를 넣어 만들었다.
인자 s
의 길이만큼 반복문을 돌려줄건데 만약 숫자가 나오면 바로 answer에 들어간다.
만약 문자열이 나오면 eng에 들어가고 그 문자열이 아까 만들어 두었던 숫자와 영어가 대응하는 배열에 포함이 되어있는지 확인한다.
만약 대응한다면 그 인덱스로 바꿔주고 eng는 비워준다.
그렇게 나온 answer는 숫자가 아닌 문자열이기 때문에 마지막으로 Number를 이용해 숫자로 바꿔주면 정답이 나온다.
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);
}
이건 split과 join의 특성을 아주 잘 이용한 풀이법이다.
예를 들어,
'one4seveneight'의 경우 split을 통해 [ '', '4seveneight'] 이 생성된다.
이후 join(i)를 통하여 두 원소 사이에 '1' (i는 1인 상태기 때문에) 이 들어가게 되어 14seveneight 이 생성된다.
이후 for문을 계속 따라가다보면
[ '14', 'eight'] // split 을 통해 생성.
147eight // join을 통해 생성.
[ '147', ''] // split을 통해 생성.
1478 // join을 통해 생성.
위 과정을 통해 '1478'이라는 문자열이 완성되고 마지막에 Number를 이용해 숫자로 바꿔주면 정답이 완성된다.
확실히 다른 사람의 풀이를 보면 하나의 메서드도 완벽하게 이해하고 있다면 풀이법이 많이 달라지는 것 같다.