[2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어

kich555·2021년 11월 1일
0

Algorithm

목록 보기
2/5

💻숫자 문자열과 영단어

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

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

숫자s(인자)
1478"one4seveneight"
234567"23four5six7"
10203"1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0zero
1one
2two
3three
4four
5five
6six
7seven
8eight
9nine

☕첫번째 풀이

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

정규표현식을 이용해 각 문자열을 해당하는 문자로 치환하였다.

  1. 정규표현식을 이용하여 문자열 치환하기
	.replace(/zero/g, 0)
    .replace(/one/g, 1)
    .replace(/two/g, 2)
    .replace(/three/g, 3)
    .replace(/four/g, 4)
    .replace(/five/g, 5)
    .replace(/six/g, 6)
    .replace(/seven/g, 7)
    .replace(/eight/g, 8)
    .replace(/nine/g, 9)

/~~~/g global을 사용해 중복되는 모든 문자열에 대한 replace()실행

 answer = Number(s)

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

처음 봤을때 뭐...지? 했다가
깨닫고 무릎을 탁 쳤던 코드.

 let numbers = ["zero", "one", "two", "three", "four", 
                "five", "six", "seven", "eight", "nine"];

idx와 요소인 문자열을 일치시킨 배열 numbers 를 선언한 후

 for(let i=0; i< numbers.length; i++) {
     
    }

for 문을 돌며,

   let arr = answer.split(numbers[i]);

split(numbers[i])numbers[i]를 제거한 새로운 배열을 만든 후

  answer = arr.join(i);

idx값인 i를 다시 배열에 끼어넣어 합친다!!

이해가 어려울 수 있으니 각 식의 결과값을 간단하게 보여주자면
'one4seveneight' 를 인자로 받으면
위의 식에 의해

[ 'one4seveneight' ]
 'one4seveneight' 

[ '', '4seveneight' ]
 '14seveneight'

[ '14','','eight' ]
 '147eight' 

[ '147', '' ]
 '1478' 

// 변화가 있는 부분만 추출하였다.

이런 식으로 split()으로 인해 numbers[i]가 사라지며 배열이 되고, join으로 인해 i가 들어와 문자열이 된다.

한편으로는 설명하고보니 기발하긴 하지만, 인자에 따라 꽤나 형변환이 많아질것 같아 성능상으로는 좀 별로일것 같긴 하다. 🧐

profile
const isInChallenge = true; const hasStrongWill = true; (() => { while (isInChallenge) { if(hasStrongWill) {return 'Success' } })();

0개의 댓글