리코딩 : 알고리즘

12. 프로그래머스 - 숫자 문자열과 영단어

BreezeBm 2021. 10. 2. 17:54

1. 문제

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

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

  • 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

2. 나의 풀이

function solution(s) {
  let numArr = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
  for (let i = 0; i < numArr.length; i ++) {
      s = s.replace(new RegExp(`${numArr[i]}`, 'g'), i)
  }
  return Number(s);
}

- 0에서 9까지 총 10번을 replace를 사용해서, 문자열을 해당하는 숫자로 변경한다.

- 처음에는 10줄 일일이 다 replace를 하나씩 쓰려고 했지만, 반복문을 활용

- 반복문을 활용하기 위해서, 숫자 배열을 만들어서 i = 0에 맞게 zero부터 시작하는 숫자 배열 작성

- 반복문을 돌면서 인덱스의 값에 맞는 단어가 있는지 확인 후, 해당 인덱스의 숫자로 변경

 

- 문제는 replace는 템플릿 레터럴이 작성이 되지 않음

- 그래서 정규표현식 객체를 사용해서 작성을 했고, 테스트가 성공적으로 진행이 됨

 

최근 정규 표현식을 사용하는 문제들을 많이 풀어서, 같은 방식으로 접근하는 것 같다. 다른 분의 풀이를 살펴보았다.

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

예를 들어 one4seveneight라는 문자열을 반복문을 돌렸을 때, i가 1일때, arr는 ["" , "4seveneight"]로 나뉘어 진다. 그리고 나서, join은 배열의 모든 요소를 연결하는데, 인자로 특정 문자열을 전달하면, 그 문자열로 요소를 연결한다. 그렇기 때문에 14seveneight가 된다. 그렇게 반복문을 돌면서, 문자열이 있으면 split하고 해당 인덱스를 join해서 숫자값으로 바꾸어 준다...

 

크으.. 공부공부..