본문 바로가기
개발/알고리즘

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

by ISA(류) 2021. 8. 13.

# 문제 원문

 

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

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

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

입출력 예

s / result

"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내

  • 정확성 테스트 : 10초

 

# 문제 풀이

 

문제 풀이는 크게 두 가지 방향성을 가진다. 입력받은 s에서 영단어로 된 숫자를 만날때 마다 해당 영단어를 해당하는 숫자로 치환하는 방법과 [0-9] 까지의 영단어를 입력 받은 s에 한번 순회하여서 해당하는 부분들을 숫자로 치환하는 방법, 어차피 [0-9]자체는 length가 10 정도 밖에 안되니 편의를 위해서 후자의 방식으로 처리했다. 매칭 되는 key, value를 배열이나, 오브젝트로 만들고(개인적으로는 객체가 좀 더 명시적으로 key,value관계를 보여주기에 객체로 만듬)

그걸 순회하면서 입력 받은 s에서 해당하는 부분들이 있는지 확인하고 있으면 그 부분을 치환해준다.

그 과정을 마친 후 얻어진 result를 반환한다. 반환 값의 타입이 number이므로 형 변환을 해서 반환해주면 끝이다.

 

# 솔루션 플로우

1. matchNumber를 만든다.(영단어와 number의 key,value 관계의 자료형)

2. matchNumber를 순회(반복) 해주면서 입력 받은 문자열 s에 해당하는 key가 있는지 확인한다.

3. s에 해당하는 key가 있으면 그에 맞는 value로 치환해준다.

4. 위 과정을 [0-9]만큼 순회한후 얻어진 result를 number로 형변환해서 반환해준다.

1. 정규표현식을 이용한 풀이

function solution(s) {
    const matchNumber = {
        zero: 0,
        one: 1,
        two: 2,
        three: 3,
        four: 4,
        five: 5,
        six: 6,
        seven: 7,
        eight: 8,
        nine: 9
    };
    let result = s;

    for (const [key, value] of Object.entries(matchNumber)) {
        const regex = new RegExp(key, 'g');
        result = result.replace(regex, value); // replaceAll 메서드를 지원안해줘서 정규 표현식 사용함
    }

    return parseInt(result);
}

 

 

반응형