프로그래머스
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)
으로 바꿔주니 모두 통과했다,,
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);
}
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);