내가 작성한 코드
function solution(s) {
let nanBox = []
let mergeBox = []
const dict =
{'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}
for(let i=0; i < s.length; i++){
if( isNaN(+s[i]) === true ){
nanBox.push(s[i])
if (dict[nanBox.join("")] !== undefined){
mergeBox.push(dict[nanBox.join("")])
nanBox=[]
}
}
else{
mergeBox.push(s[i])
}
}
return Number(mergeBox.join(''))
}
해석
우선 입출력이 어떻게 되는지 살펴보자
이 글에서는 s는 첫번째 테이블을 예시로 한다.
s: "one4seveneight"
result: 1478
프로퍼티는 숫자 문자열, 값은 정수로된 객체를 선언한다.
const dict = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}
다음으로 문자열 s의 길이만큼 반복문을 돌린다. (14번의 루프)
처음 나오는 if문의 조건은 s의 i번째 인덱스 값의 타입을 number로 바꾼 값이 정수형인지 아닌지를 판단하는 조건을 주었다. 0번째 부터 2번째 인덱스 값은 "one" 이므로 true가 나오며 3번째 인덱스 값은 4 이기때문에 문자열 4를 정수형으로 변환하여 정수형이기때문에 조건문에서 false 값을 가지게 된다.
if( isNaN(+s[i]) === true )
true를 가진 인덱스값은 빈 배열인 nanBox에 push해준다.
if( isNaN(+s[i]) === true ){
nanBox.push(s[i])
다시 들여쓰기로 조건문이 하나 더 나온다.
if (dict[nanBox.join("")] !== undefined)
push 되어진 nanBox를 join한 값으로 dict의 괄호표기법으로 프로퍼티에 접근한다.
접근할 때 join한 값이 프로퍼티에 없다면 undefined이출력된다.
즉,
- i=0일때 nanBox의 값은 o 이므로 undefined
- i=1일때 nanBox의 값은 on 이므로 undefined
- i=2일때 nanBox의 값은 one 이므로 undefined가 아니게 되어 조건문이 true가 되어 실행된다.
if (dict[nanBox.join("")] !== undefined){
mergeBox.push(dict[nanBox.join("")])
nanBox=[]
true이면 빈 배열인 mergeBox에 push 한다. (객체의 괄호표기법으로 접근하여 값이 있다면 해당 값을 가져온다.
프로퍼티의 값으로 "one"는 1을 가져옴) 현재 mergeBox에는 1이 푸쉬되었다.
mergeBox에 푸쉬가 되면 nanBox를 다시 빈 배열로 초기화한다. 푸시된 one를 없에줘야 다음 seven과 eight도 푸쉬할 수 있기때문이다. 초기화 하지않는다면 onesevenei... 으로 쌓이게 되어 seven을 넣어도 oneseven 상태가 되어 있기 때문에 undefined 값을 가질 것이다.
처음 조건문에서 false값을 가진다는 것은 정수형이기 때문에 그대로 mergeBox에 푸쉬해준다.
else{
mergeBox.push(s[i])
}
마지막으로 return 해준다.
mergeBox를 join한 값을 정수형으로변환하자.
return Number(mergeBox.join(''))
더 좋은 코드
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);
}
replace를 이용한 깔끔한 코드
function solution(s) {
s = s.replace(/zero/gi, 0)
.replace(/one/gi, 1)
.replace(/two/gi, 2)
.replace(/three/gi, 3)
.replace(/four/gi, 4)
.replace(/five/gi, 5)
.replace(/six/gi, 6)
.replace(/seven/gi, 7)
.replace(/eight/gi, 8)
.replace(/nine/gi, 9)
return parseInt(s);
}
'알고리즘 & 자료구조 > 프로그래머스' 카테고리의 다른 글
이상한 문자 만들기 [Javscript] (0) | 2022.07.10 |
---|---|
시저 암호 [Javascript] (0) | 2022.07.10 |
로또의 최고 순위와 최저 순위 [Javascript] (0) | 2022.07.10 |
크레인 인형뽑기 게임 [Javascript] (0) | 2022.07.10 |