숫자 문자열과 영단어(Javascript)

·2022년 9월 26일
0
post-thumbnail

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0zero
1one
2two
3three
4four
5five
6six
7seven
8eight
9nine

제한사항

1 ≤ s의 길이 ≤ 50
s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예

sresult
"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()을 사용해서 숫자로 바꾸어 줬다.

참고할 풀이 2

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를 사용해서 나열을 할 거라면 굳이 함수를 만들지 않고 이런식으로 쓰는 게 가독성이 나을 수 있겠다는 생각이 든다.

profile
전 이것도 몰라요

0개의 댓글

관련 채용 정보