레벨1의 카카오 문제이다.
숫자문자와 영어숫자 단어가 섞인 문자열이 주어진다.
‘1oneone’ 이렇게 주어지면
숫자는 그대로 숫자로 바꾸고 영어는 숫자로 치환하여 숫자를 리턴하면된다.
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에 대해 다시 찾고 공부하게 되는 계기가 되었다.