본문 바로가기
코딩테스트(알고리즘)

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

by Cafe Mocha 2022. 4. 26.

문제 출처

코딩테스트 연습 - 숫자 문자열과 영단어 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 숫자 문자열과 영단어

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

programmers.co.kr

 

위 문제는 숫자 문자열을 찾고 대응되는 숫자로 변경하면 되는 문제였다.

 

방법은 두가지로 진행.

 

1. 나의 풀이

replace([변경될 문자열], [변경할 문자열])

문법: str.replace(regexp|substr, newSubstr|function)

 

replace를 활용하면 간단하게 해결할 수 있다고 생각했으나, replace의 특성을 정확하게 알지 못해 시간이 오래 소요되었다.

replace는 원래 문자열은 변경하지 않으며, 치환한 문자열을 반환한다.

 

하기와 같이 문제를 풀었으나, 테스트 케이스에서 문제가 발생.

replace는 첫번째 문자열만 바꿔주기 때문에 숨겨진 테스트 케이스 중 두개 이상의 숫자가 영어로 있는 경우 실패하는 것으로 판단.

function solution(s) {
    let answer = 0;
    let nums = ['zero','one','two','three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    for(let i=0;i<nums.length;i++){
        s = s.replace(nums[i],i);
    }
    answer = Number(s);

    console.log(answer)
    
    return answer;
}

 

replaceAll로 가능하나, 프로그래머스 환경에서는 사용이 불가능해 정규식 풀이로 대신한다.

function solution(s) {
    let answer = 0;
    
    s = s.replace(/zero/g, 0);
    s = s.replace(/one/g, 1);
    s = s.replace(/two/g, 2);
    s = s.replace(/three/g, 3);
    s = s.replace(/four/g, 4);
    s = s.replace(/five/g, 5);
    s = s.replace(/six/g, 6);
    s = s.replace(/seven/g, 7);
    s = s.replace(/eight/g, 8);
    s = s.replace(/nine/g, 9);
    
    answer = Number(s);
    return answer;
}

 

 

2. 타인의 풀이

split, join을 활용한 문자열 변경

split과 join을 활용한 문제풀이는 많이 진행했었지만, 아래와 같이 활용할 수 있다는 점은 처음 알았다.

정확하게 알고 사용하는 문제 풀이가 인상깊었다. 

function solution(s) {
    var answer = s;
    
    let nums = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    
    
    
    for (let i =0; i<nums.length;i++){
        let arr = answer.split(nums[i]);
        answer = arr.join(i);
    }
    
    

    
    return Number(answer);
}