본문 바로가기
혼자 공부하는 것들/알고리즘

[프로그래머스] 숫자 문자열과 영단어 (2021 카카오 채용연계형 인턴십)

by applepick 2021. 8. 28.
반응형

알고리즘 문제를 천천히 하나하나 풀어보고 있습니다.

문자열을 다루는 문제 중에 괜찮아 보여서 풀어보았습니다.

 

문제 설명

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

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

  • 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) {
    var answer = s;
    let number = [ "zero", "one", "two", "three", "four", "five", "six", "seven"
                 , "eight", "nine"];
    
    for(let i = 0; i<number.length; i++){
           let arr = answer.split(number[i]);
            answer = arr.join(i);
        
    }
    return Number(answer);
}

처음에 number라는 배열에 대응하는 단어를 저장합니다. number의 배열을 순환하면서 해당 단어가 answer에 있는지 확인하여 split으로 단어를 나눠 결과 값을 arr에 넣어줍니다. 그 위치에 대응하는 숫자를 대입(join 사용)하여 저장해줍니다. 0~9까지 확인한 뒤 Number형으로 변환 뒤 반환해줍니다.

array.join에 관한 정보는

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/join

 

Array.prototype.join() - JavaScript | MDN

join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.

developer.mozilla.org

공식문서를 참고하면 좋을 듯합니다. 

+ 추가
다른 분들은 정규식을 이용해서 푸셨더라고요 

function solution(s) {
    var 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;

이런 식으로 접근할 수도 있네요 

반응형

댓글