프로그래머스 js 숫자 문자열과 영단어

이명진·2022년 7월 30일
0

코드카타

목록 보기
33/69

레벨1의 카카오 문제이다.

문제 해설

숫자문자와 영어숫자 단어가 섞인 문자열이 주어진다.
‘1oneone’ 이렇게 주어지면
숫자는 그대로 숫자로 바꾸고 영어는 숫자로 치환하여 숫자를 리턴하면된다.

1차 문제 풀이

function solution(s) {
    let answer = [];
  let arr = s.split('')
  arr.map((x,idx)=>{
    
    if(x*1>-1){

      answer.push([x*1,idx])
    }
  })
          const code =  {'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9}
         
 for(let keys in code){
   let idx = s.indexOf(keys)
   // console.log(idx)
   if(idx>-1){
     answer.push([code[keys],idx])
   }
   
 }
  answer.sort((a,b)=>a[1]-b[1])
  
    return answer.map(x=>x[0]).join('')*1;
          
          
  
}

숫자와 영어를 따로 분리해서 배열에 넣어두고 합치려고 했다.
단 순서가 섞일수 있으니 각각 반복문에 index를 구해서 같이 넣어주고
sort할때 인덱스로 정렬했다.

테스트 케이스를 다 맞추고 정답에 가까워 질뻔 하였으나
몇문제가 틀렸다. 힌트를 찾아보니
‘1oneoneone’ 이런 케이스가 풀리지 않았다.

Code 객체를만들어서 각 영어 단어들을 대응하게 하였고
객체의 code 갯수로 반복문을 돌렸는데 저렇게 반복되어 있으면
하나만 찾고 끝낸다.

정규표현식은 쓰고 싶지 않았으나 다른 방법을 사용하면 오래걸릴것 같다.

그 다음 생각한게 스택과 큐 방법이었다.

한글자식 큐에 넣어두고 하나씩 대입해서 맞으면 숫자로 변경
큐를 비워두고 다시 큐에 넣는 방법으로 하고 싶었지만
시간이 오래걸릴것 같았다.

두번째 풀이

정규표현식을 사용해서 문제를 풀었다.
템플릿리터럴 을 사용하여 code 객체 하나하나 씩 대입해서 바꿔주었다.

   const code =  {'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9}
      let x =''          
      for(let keys in code){
        x=keys
       let regex= new RegExp(`${keys}`,'ig');
      
        s = s.replaceAll(regex,code[keys])
      
        
      }
    return s *1

결과는 성공 했지만 정규식을 쓰고싶지 않아서 좀더 생각해보다가
다른사람의 풀이를 보게 되었다.

다른사람의 풀이

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

딱봐도 정규표현식을 안쓰고 간결하고 완벽했다.
쭉 보니 내가 split과 join에 대해 확실히 모르구나 라는 생각을 했다.
이를 계기로 split 과 join에 대해 다시 찾고 공부하게 되는 계기가 되었다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글