[코드테스트]숫자 문자열과 영단어

이강민·2021년 10월 23일
0
post-thumbnail

숫자 문자열과 영단어

문제

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

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

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

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

요망 결과

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

문제풀이

본인은 이 문제를 보자마자 전에 배운 정규표현식이 떠올랐다.
무작위로 나오는 영어숫자의 위치와 0의 위치에 따라 표현할지 말지 결정하는 것이 마치 아이디를 받아서 원하는 결과를 출력해주는 이전 문제와 흡사하다고 생각했기 때문이다.

한번 작성을 해보자

function solution(s) {
    let answer = '';
//answer에 곧바로 받기로 하였으며 영어단어에서 숫자로 전환은 replace를 활용하였다. 
    answer = s.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')
    .replace(/(zero)/g,'0') 
    .replace(/(^zero)/g,'')//첫번째 나오는 zero는 빈 문자열로 변환
    return parseInt(answer); //결과를 정수로 변환하였다. 
}
//결과를 확인해보자. 
console.log(solution('one4seveneight'))
console.log(solution('zero23fourzero5six7'))
console.log(solution('2three45sixseven'))
console.log(solution('123'))

위와 같이 문자 하나하나를 찾아내고 문자마다 replace의 변환값을 지정해주어도 결과는 똑같이 나온다.
하지만 위와 같은 코드의 단점은 replace의 반복과 긴 코드이다.
아래는 다른 사람이 split과 join만으로 영어단어를 숫자로 변환한 예시이다.

function solution(s){
//먼저 배열안에 각 영단어를 정의하였다. index와 영어숫자의 위치를 일치시켰다. 
	const arr = ['zero','one','two','three','four','five','six','seven','eight','nine'];
//answer에 매개변수로 들어온 값을 바로 넣었다.
	let answer = s;
	//배열의 길이만큼 배열을 반복시키고 answer에 arr에 해당하는 단어가 존재할 경우 split하여 배열로 반환시켰다. 만약 값이 있으면 빈 문자열로 배열이 만들어  질 것이다. 
	for(let i = 0; i < arr.length; i ++){
		let arr2 = answer.split(arr[i]);
//빈 문자열은 아래의 join에서 해당하는 i로 합쳐질 것이다. 
		answer = arr2.join(i);
	}
//join의 반환 값은 문자열로 Number로 변환 시켰다. Number는 맨 앞이 0으로 시작하면 생략하고 나머지 문자형 숫자를 숫자형으로 변환 시킨다. 
	return Number(answer);
}

console.log(solution('zeroone249nine'))

처음에 위 코드가 이해가 되지 않아 조금씩 뜯어 보기로 하였다.
arr와 매개변수에 해당하는 값을 직접 적었고 확인해보았다.

let arr1 = 'zeroone2four'.split('zero')
//split하는 문자열 안에 zero가 존재하면 zero를 기준으로 나뉘어 배열로 반환한다. 즉, ['', 'one2four']가 된다. 
console.log(arr1)
//위에 해당하는 배열을 join을 통해 문자열로 다시 반환시키는데 join(string? : string)은 join안에 무엇과 합칠 것인지 적게 되었다. 
//join에 zero의 index 해당하는 0을 넣어보았다.
let answer1 = arr1.join(0)
//결과는 0one2four라는 문자열을 반환하였다. 
console.log(answer1)

위의 코드에 대한 사고의 흐름은 다음과 같다.
1. zero~nine까지 배열로 만들면서 index와 동일하게 만들자.
2. answer에 매개변수를 직접 넣어 answer을 이용하자
3. answer을 split하는데 배열의 값들로 split하면 되겠다.
4. for구문으로 작업을 배열의 길이만큼 반복시키자.
5. 나누어 반환된 값을 다시 문자열로 합치기 위해 join을 이용하자
6. 배열에 해당되는 값은 index와 동일하다.
7. join에 index를 넣으면 그 숫자로 합쳐지겠다!
8. 결과 값은 문자열이고 앞에 0이 있으니 Number로 변환시키자.

split과 join을 알아도 이렇게 까지 효율적으로 작업 할 수 있다는 것이 정말 신기하다! 직접 작성한 방식은 아니지만 앞으로 활용할 수 있기에 기대가 된다.!

profile
AllTimeDevelop

0개의 댓글

관련 채용 정보