[Programmers] 영어가 싫어요

그래도 해야지·2023년 5월 23일
0

Programmers

목록 보기
40/40
post-thumbnail

문제 설명
영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.

제한사항
numbers는 소문자로만 구성되어 있습니다.
numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
1 ≤ numbers의 길이 ≤ 50
"zero"는 numbers의 맨 앞에 올 수 없습니다.

입출력 예
numbers result
"onetwothreefourfivesixseveneightnine" 123456789
"onefourzerosixseven" 14067

🤔 해설

  1. 먼저 number를 배열로 만든다.
const number = ["zero","one","two","three", "four", "five", "six", "seven", "eight", "nine"]
  1. 반복문을 사용해서 number 배열의 각 요소를 돌리고,
    numbers 문자열에서 현재 순회 중인 number 배열의 요소를 찾아 해당 숫자의 인덱스로 대체해준다. (split()join()사용)
numbers = numbers.split(number[i]).join(i)
  1. 반복문이 종료되면 numbers문자열은 영단어 숫자가 모두 숫자 값으로 대체된 문자열임.
    단항 덧셈 연산자+로 피연산자를 숫자로 변환한다.
    그러니까 문자열이 "10"이 저장되어 있다면, +numbers는 숫자 10을 반환한다.
+numbers

✅ 답

function solution(numbers) {
    const number = ["zero","one","two","three", "four", "five", "six", "seven", "eight", "nine"]
    for(let i = 0 ; i<number.length; i++){
        numbers = numbers.split(number[i]).join(i)
    }
    return +numbers
}

알게된 것
단항 덧셈 연산자 +
index로 합치고 싶을 땐 join(i)

split(), join()에 대해 안다고 생각했지만.. 아니었다.

  • 사실 이 부분에서 "onefourzerosixseven" 인덱스로 split()으로 구분을 한다면 차례대로가 아닌데..? 어떻게 매칭을 한건지? 이해가 안됐는데
numbers.split(number[i])
  • 그러니까 split은 순서에 상관없이 split의 괄호 안에 있는 문자를 찾아서 구분을 짓는 것이었다.
let abc = 'zeroonetwo';
console.log(abc.split('one'))
// ['zero', 'two']

abc.split('one').join(1)
// 'zero1two'

let a = 'onefourzerosixseven'
a.split('zero')
// ['onefour', 'sixseven']
  • 그렇다면 join은 배열에서 구분되는 부분에 join에 들어가는 부분을 추가해서 문자열로 만들어주는 것이다!
const arr = ['zero', 'two']
arr.join('1')
// 'zero1two'

0개의 댓글