본문 바로가기
내일배움 과제/코딩테스트

알고리즘 46번 - 숫자 문자열과 영단어

by GREEN나무 2024. 12. 25.
728x90

URL : https://school.programmers.co.kr/learn/courses/30/lessons/81301

JS

문제

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
제한사항
1 ≤ s의 길이 ≤ 50
s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

 


계획

영단어와 인덱스와 값이 같도록 배열을 만들기

숫자는 그냥 빼고 문자는 배열의 값과 같은 것이 있는지 확인하고 있으면 그 값의 인덱스를 가져오기

변화난 배열을 join해서 반환하기


참고, 풀이

isNaN : JavaScript에서 'Not-a-Number'를 확인하는 함수. 주어진 값이 숫자가 아닌 경우 true를, 숫자인 경우 false를 반환

isNaN(문자)
console.log(isNaN(123));      // false (123은 숫자)
console.log(isNaN("456"));    // false ("456"은 숫자로 변환 가능)
console.log(isNaN(3.14));     // false (유효한 숫자)
console.log(isNaN("Hello"));  // true ("Hello"는 숫자로 변환 불가)
console.log(isNaN(undefined));// true (undefined는 숫자가 아님)
console.log(isNaN(NaN));      // true (NaN 자체도 숫자가 아님)

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

function solution(s) {
    let arrNew = [];
    let temp = "";

    for (let char of s) {
        if (!isNaN(char)) {
            // 숫자인 경우
            arrNew.push(Number(char));
        } else {
            // 숫자가 아닌 경우
            temp += char; // 임시로 문자를 누적
            let index = numE.indexOf(temp); // `numE` 배열에서 검색
            if (index !== -1) {
                // 단어가 완성되었을 경우
                arrNew.push(index);
                temp = ""; // 누적 초기화
            }
        }
    }

    return Number(arrNew.join(""));
}

console.log(solution("4fourfive5six79"));

코드 간략화하기

function solution(s) {
  const numE = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
  numE.forEach((word, idx) => {
    s = s.replaceAll(word, idx);
  });
  return Number(s);
}

s.replaceAll(word, idx) : 일치하는 문쟈를 찾아서 교체하는 기능

  문자열 내에서 모든 word를 찾아 idx로 교체하는 JavaScript 메서드입니다.

  • 특징: 원본 문자열은 수정되지 않고, 교체된 새 문자열을 반환합니다.
  • 차이점: replace는 첫 번째 일치 항목만 교체하지만, replaceAll은 모든 일치 항목을 교체합니다.
  • 주의: ES2021 이상에서만 지원되므로 오래된 브라우저에서는 사용할 수 없습니다.
let s = "one two one three";
s = s.replaceAll("one", "1"); 
console.log(s); // "1 two 1 three"

 

다른사람 답

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);
}
const digit2word = ['zero','one','two','three','four','five','six','seven', 'eight','nine']
function solution(s) {
    return Number(digit2word.reduce((ans, word, digit) => ans.replace(new RegExp(word, 'g'), digit), s));
}

참고

https://school.programmers.co.kr/learn/courses/30/lessons/81301/solution_groups?language=javascript