한 걸음씩 기록하며

[프로그래머스 코딩테스트] 숫자 문자열과 영단어 본문

알고리즘 & 코딩테스트

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

Haksae 2022. 1. 20. 14:44

[숫자 문자열과 영단어]

문제 설명 :

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

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

  • 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로 주어집니다.

 

📁 입출력 예시

👉🏻  답안

function solution(s) {
    let numberStr = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];// 1
    let arr = [...s];    //  spread operator
    let alphabet = [];

    if(!isNaN(s)) return number(s);        // s가 전부 숫자라면 바로 리턴
    for (let i = 0; i < arr.length; i++) {    // 숫자가 아니라면 for문
        if (isNaN(arr[i])) {                  // arr[i] 하나씩 불러서 문자라면
            alphabet.push(arr[i]);            // 알파벳 배열에 하나씩 넣는다
        } else {                              // 숫자라면 그냥 돌린다
            continue;
        }                                     // continue라면 for문은 계속 유지중
        let str = alphabet.join('')           // 알파벳 배열을 str이라는 문자열 생성
        for (let j = 0; j < numberStr.length; j++) {  // for문으로
            if (str === numberStr[j]) {               // str과 numberStr이 같다면
                s = s.replace(str, j);                // s의 str을 j로 치환
                alphabet = [];                 // 알파벳 배열 초기화
            }
        }
    }
    return s;
}

📑  간단한 설명

진이 다 빠진 문제였다.. 엄청 시도했고 헤맸고 실패했다. 그래서 다른 블로그 글을 보고 힌트를 얻어, 내 답안을 전부 뜯어 고쳐서 풀었다.

위에 설명도 나름? 상세하게 적어놨다.

- .replace(str, str2) : 해당 문자열 안에 str을 str2로 치환하는 함수

아래에는 내가 참고한 블로그 주소를 남긴다. 굉장히 상세하게 설명해놓으셨으니 아래의 블로그 참고해도 좋겠다.

 

💪🏻 공부하면 좋을 답안

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);
}
  • 보자마다 엄지척이 나오는 답안
  • answer를 문자열로 split 하고, 다시 join(i)로 합쳤다.
  • 즉 선택자가 one로 나뉘어졌으면, 다시 선택자를 1로 붙이는 것
  • 신박하다..

 

위에서 언급한 블로그

https://velog.io/@park485201/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%AB%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EC%98%81%EB%8B%A8%EC%96%B4-Javascript

Comments