[Lv.1]숫자 문자열과 영단어

Jihyun-Jeon·2022년 2월 28일
0

문제 : https://programmers.co.kr/learn/courses/30/lessons/81301

🔶내가 한 방법

  1. 객체에 "문자:숫자"의 나열을 만듦.
  2. 객체를 순회하면서 해당 문자를 숫자로 바꿈 - (for in, replce)
  3. 같은 문자가 여러개 있을 수 있으므로 for in 안에 해당값이 있을때까지 반복하게끔 처리 - (while)
  4. txt의 타입이 string이므로 타입을 number로 바꿈
function solution(txt) {
  const list = {
    zero: 0,
    one: 1,
    two: 2,
    three: 3,
    four: 4,
    five: 5,
    six: 6,
    seven: 7,
    eight: 8,
    nine: 9,
  };

  for (const obj in list) {
    while (txt.indexOf(obj) !== -1) {
      txt = txt.replace(obj, list[obj]);
    }
  }

  return Number(txt);
}

console.log(solution('one4seveneight')); // 1478
console.log(solution('23four5six7')); // 234567
console.log(solution('2three45sixseven')); // 234567
console.log(solution('1zerozero')); // 100
console.log(solution('oneonesixsix')); // 1166

🔶다른사람 풀이

//방법1 - replace, while, isNaN 활용
function solution(s) {
    while(isNaN(+s)) {
        s = s.replace('zero',0)
        s = s.replace('one',1)
        s = s.replace('two',2)
        s = s.replace('three',3)
        s = s.replace('four',4)
        s = s.replace('five',5)
        s = s.replace('six',6)
        s = s.replace('seven',7)
        s = s.replace('eight',8)
        s = s.replace('nine',9)
    }
    return +s
}

//방법2 - for, split, 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);
}


//방법3 - entries, 정규식 활용
function solution(s) {
  let charSet = {
    zero: 0,
    one: 1,
    two: 2,
    three: 3,
    four: 4,
    five: 5,
    six: 6,
    seven: 7,
    eight: 8,
    nine: 9,
  };
  for (let [key, value] of Object.entries(charSet)) {
    let re = new RegExp(key, 'g'); //<-new RegExp로 정규식 쓸땐 모든 인자를 문자로 "g"이렇게 써야 함.
    s = s.replace(re, value);
  }
  return parseInt(s, 10);
  //parseInt는 기수(radix)(10진수)를 2번째 인자에 항상 넣어줘야 함, 안넣어주면 2진수로 변환되서 출력되는 경우가 있어서.
}

 

🔶피드백

  • 질문 : replace로 해당 문자를 다 숫자로 바꿧는데 타입이 여전히 string인 이유는?? : "1234"이렇게 된 것임. 따라서 최종적으로 자료형을 number로 바꿔줘야 함.

  • 문자를 정수로 바꾸기

console.log(+'23'); // 23 ←1.문자열에 포함된 숫자를 찾아서 number로 형변환을 시켜준다.
console.log(+'one23'); // NaN ←2.그러나 문자를 정수로 바꾸면 NaN
console.log(typeof +'one23'); // number ←3.NaN도 유형이 number임.
  • Object.entries()
    -의미: 주어진 "객체"의 각 요소를 [key, value] 쌍의 "배열로" 반환함.
    -반환: [key, value] 배열
    const object1 = {
      a: 'some1',
      b: 'some2'    };

    console.log(Object.entries(object1)); // [ ["a","some1"] , ["b","some2"] ]
  • String.split()
    -의미: 어떤 부호 기준으로 그 부호 앞뒤로 문자열을 나눠 배열의 요소로 만들어 반환함
    -반환: "문자열을 → 배열로" 반환.

  • Array.join()
    -의미: 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.
    -반환: "배열을 → 문자열로" 반환.

     let txt = 'oneone234';
     txt = txt.split('one'); // ["","","234"]
     txt.join(1); // 11234

0개의 댓글