숫자 문자열과 영단어

Creating the dots·2021년 9월 29일
0

Algorithm

목록 보기
18/65

프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/81301#qna

나의 풀이

function solution(s) {
    var answer = '';
    let str = '';
    const match = ['zero','one','two','three','four','five','six','seven','eight','nine'];
  
  //match 배열에서 일치하는 문자열의 인덱스를 리턴하는 함수
    const findMatch = (str) => {
        if(match.includes(str)){
            return match.indexOf(str);
        }
        return false;
    }
    
   //문자열의 경우 누적해서 findMatch 함수로 인덱스(벨류와 동일)를 구해 answer에 누적한다
   //숫자라면, answer에 누적한다
    for(let i=0;i<s.length;i++){
        if(isNaN(Number(s[i]))){
           str+=s[i];
           const idx = findMatch(str);
           if(idx){
              answer+=idx;
              str='';
           }
        }else{
            answer+=s[i];
        }
    }
    return Number(answer);
}

나는 findMatch라는 함수를 만들어서 반복문의 if 코드블록안에서 findMatch의 리턴값에 따라 내부 if 코드블록을 실행시켰는데, 테스트케이스 7,8,9가 통과하지 않았다,,
~~그런데 다른 사람이 공유한 풀이는 함수를 쓰지 않았다는 점 빼고는 나와 거의 똑같았다. ~~

(수정) 드디어 문제를 찾았다. 같이 스터디하는 분들 도움 덕분에 해결할 수 있었다.

findMatch에서 리턴되는 값(idx)이 0부터 9까지 숫자이거나 false인데, if(idx)부분에서 idx===0인 경우 if문이 실행되지 않는다!

따라서 if(idx || 0)으로 바꿔주니 모두 통과했다,,

다른 사람 풀이(1)

function solution(s) {
    let answer = "";
    let temp = "";

    const word_arr =
          ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];

    for (let i=0; i<s.length; i++){

        if(isNaN((Number(s[i])))){
            temp += s[i]; 
            if (word_arr.includes(temp)){ 
                answer += word_arr.indexOf(temp);
                temp = ""; 
            }
        } else {
            answer += s[i]; 
        }
    }

    return Number(answer);
}

다른 사람 풀이(2)

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

String.prototype.split()

String 객체를 지정한 구분자를 이용해 여러개의 문자열로 나누는 메소드

Array.prototype.join()

배열의 모든 요소를 연결해 하나의 문자열로 만든다

그동안은 split 메소드는 string.split('') 또는 string.split(' ') 이 두 경우로만 사용했다. 그래서 구분자로 다른 문자열을 사용할 수 있다는 생각을 하지 못했다.

그리고, join 메소드도 array.join() 또는 array.join('')으로만 사용했었다.

const str1 = 'hello';
console.log(str1.split('h')); //["", "ello"]
console.log(str1.split('')); //["h", "h", "e", "l", "l", "o"]

const str2 = 'hhello';
console.log(str2.split('h')); //["", "", "ello"]

//풀이에서 사용된 경우
const numbers = ['zero','one','two','three','four','five','six','seven','eight','nine'];
let answer = "one3seven";
for(let i=0;i<numbers.length;i++){
  let arr = answer.split(numbers[i]);
  answer = arr.join(i)
}
return Number(answer);
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글