[프로그래머스] 숫자 문자열과 영단어

채연·2023년 8월 15일
0

programmers

목록 보기
5/5

문제

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

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

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

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

내 코드

이전 문제가 문자열 자르는 문제여서 이걸 보자마자 문자열을 자른 후 대치해야겠다고 생각했다.

0~9로 딱 정해져있기에 if문을 돌려보자!

물론 내 코드가 안 좋을 거란 생각은 200% 있었지만, 다른 방법이 도무지 떠오르지 않아 일단 해결에 목적을 두고 문제를 풀었다.

function solution(s) {
    var answer = '';
    
   while(s) {
        if(s.substr(0, 1) < '0' || s.substr(0, 1) > '9') { 
            if(s.substr(0, 3) === 'one') {
                s = s.substring(3)
                answer += '1'
            }else if(s.substr(0, 4) === 'zero') {
                s = s.substring(4)
                answer += '0'
            }else if(s.substr(0, 3) === 'two') {
                s = s.substring(3)
                answer += '2'
            }else if(s.substr(0, 5) === 'three') {
                s = s.substring(5)
                answer += '3'
            }else if(s.substr(0, 4) === 'four') {
                s = s.substring(4)
                answer += '4'
            }else if(s.substr(0, 4) === 'five') {
                s = s.substring(4)
                answer += '5'
            }else if(s.substr(0, 3) === 'six') {
                s = s.substring(3)
                answer += '6'
            }else if(s.substr(0, 5) === 'seven') {
                s = s.substring(5)
                answer += '7'
            }else if(s.substr(0, 5) === 'eight') {
                s = s.substring(5)
                answer += '8'
            }else if(s.substr(0, 4) === 'nine') {
                s = s.substring(4)
                answer += '9'
            } 
        } else {
            answer += s.substr(0,1)
            s = s.substring(1)
        }
   }
    
    return Number(answer);
}

-> 3개를 봤을 때 one이라면 1을 answer에 추가하고 one이라는 글자를 삭제하고 다시 돌리고 하는 과정을 계속해서 반복하였다.

이슈

제일 처음 숫자인지 아닌지 확인하는 If문에서 !Number(s.substr(0, 1)) 이라는 조건을 사용하였다.

그 결과, 0도 ! <-에 해당해버려 문자열 조건문으로 가서 무한루프를 돌게되는 문제가 발생하였답..

다른사람 코드

당연히, 나의 코드가 더러워 다른 사람들의 코드를 유심히 살펴보았다.

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);
}

그 중 눈에 띄는 코드였다.

와 .. 어떻게 이 문제를 이렇게 짧게 코드를 짜지? 하고 코드를 해석해보는데

뜯어볼수록 더더욱 배울 게 많은 코드였다!!

코드 뜯어보기

s = 'onefour3two' 이라고 생각해보자

s.split('one') 을 하면 one을 기준으로 split이 되어 ['', 'two3four']로 나누어진다.

그리고 여기에 1을 join 시키면 1four3two가 되는 로직이다.

다음 배열을 순환할 때는 two에서 걸리게 되는데 이번엔 two를 기준으로 split 되어 ['1four3', '']가 되고 join(2) 입히면 1four32가 된다.

마지막 four까지 하면 1432로 무사히 변환 완료!!

배운점

split의 활용성
join의 활용성

profile
Hello Velog

0개의 댓글